尝试标记字符串并将每个部分插入数组时出错

问题描述 投票:0回答:1
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]);
    }

}

我正在尝试分割具有以下格式的行:

3245,03/04/2020,Jiangxi,Mainland China,2020-03-04T01:33:07,935.0,1.0,884.0

我尝试将strtok","分隔符一起使用,但我一直得到此`

RUN FAILED(退出值-1,073,741,819,总时间:1秒

如果我的代码不清楚,请不要犹豫,向我询问

c tokenize
1个回答
0
投票

文件中可能有空白行。它没有任何令牌,因此i将在循环后为0array[i]将未初始化,并且array[i-1]array[i-2]将在数组之外,因此访问它们会导致未定义的行为。

检查您是否已获得足够的令牌,否则请跳过该行。

此外,由于在分配令牌后增加了i,因此array[i]在分配的元素之后。您应该使用i-3i-2i-1来获取最后3个令牌。

// 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]);
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.