C 尝试标记字符串并在数组中插入每个部分时出错
我正在尝试拆分具有以下格式的行:C 尝试标记字符串并在数组中插入每个部分时出错,c,tokenize,C,Tokenize,我正在尝试拆分具有以下格式的行: while (fgets(buff, sizeof (char*)*100, file)) { if (line == 0) { fgets(buff, sizeof (char*)*100, file); line++; } int i = 0; char *p = strtok(buff, ","); char *array[10]; while (p != NULL) {
while (fgets(buff, sizeof (char*)*100, file)) {
if (line == 0) {
fgets(buff, sizeof (char*)*100, file);
line++;
}
int i = 0;
char *p = strtok(buff, ",");
char *array[10];
while (p != NULL) {
array[i++] = p;
p = strtok(NULL, ",");
}
if (!strcmp(array[1], "03/04/2020")) {
*inf += atof(array[i - 2]);
*dead += atof(array[i - 1]);
*rec += atof(array[i]);
}
}
我尝试使用strtok
和“,”
分隔符,但我一直得到这个结果`
运行失败(退出值-1073741819,总时间:1s
如果我的代码不清楚,请毫不犹豫地询问我。文件中可能有一个空行。它没有任何标记,因此
i
将在循环后0
。array[i]
将未初始化,array[i-1]
和array[i-2]
将位于阵列外部,因此访问它们会导致未定义的行为
检查您是否已获得足够的代币,否则跳过该行
另外,由于您在分配令牌后增加了i
,array[i]
位于您分配的元素之后。您应该使用i-3
、i-2
和i-1
来获取最后3个令牌
3245,03/04/2020,Jiangxi,Mainland China,2020-03-04T01:33:07,935.0,1.0,884.0
//跳过标题行
fgets(buff,sizeof(char*)*100,文件);
while(fgets(buff,sizeof(char*)*100,file)){
int i=0;
char*p=strtok(buff,“,”);
字符*数组[10];
while(p!=NULL){
数组[i++]=p;
p=strtok(空,“,”);
}
如果(我按原样发布了一个。其他人无法成功编译发布的代码。-1073741819
是您将DWORD
322225477
打印为带符号整数时得到的。322225477
aka0xC0000005
是Windows用来表示保护故障的信号(unix术语中的“SIGSEGV”)。这意味着您正在取消引用包含NULL
或其他错误值的指针变量。请确保循环后i>=2
,否则array[i-2]
将访问数组外部。如果文件中有空行,则会发生错误,因为不会有任何标记。而不是if(line==0)
test每次通过循环,在循环之前调用fgets()
跳过标题行一次。问题是我不能跳过任何一行,因为我需要从每行提取最后三个数字。此外,我确定文件中不包含空行:(结尾可能有一个空行。顺便问一下,有些行可能会遗漏一些元素,例如:3245,03/04/2020,中国大陆,2020-03-04T01:33:07935.0,1.0884.0确实,我刚刚检查了一下,发现结尾有一个空行。您建议如何解决此问题?这应该不会有问题,因为您不使用空字段。strtok()
将这些存储为空令牌。
// skip header line
fgets(buff, sizeof (char*)*100, file);
while (fgets(buff, sizeof (char*)*100, file)) {
int i = 0;
char *p = strtok(buff, ",");
char *array[10];
while (p != NULL) {
array[i++] = p;
p = strtok(NULL, ",");
}
if (i <= 3) { // skip lines that don't have enough tokens
continue;
}
if (!strcmp(array[1], "03/04/2020")) {
*inf += atof(array[i - 3]);
*dead += atof(array[i - 2]);
*rec += atof(array[i-1]);
}
}