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
aka
0xC0000005
是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]);
    }
}