ошибка при попытке токенизации строки и вставки каждой части в массив - PullRequest
0 голосов
/ 16 марта 2020
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с

Если мой код неясен, ПОЖАЛУЙСТА, НЕ СТЕСНЯЙТЕСЬ, ЧТОБЫ СПРОСИТЬ МНЕ ОБ ЭТОМ

1 Ответ

1 голос
/ 16 марта 2020

Возможно, в файле пустая строка. У него не будет никаких токенов, поэтому i будет 0 после l oop. array[i] будет неинициализировано, а array[i-1] и array[i-2] будут вне массива, поэтому доступ к ним вызывает неопределенное поведение.

Убедитесь, что у вас достаточно токенов, и пропустите строку в противном случае.

Кроме того, поскольку вы увеличиваете i после назначения токена, array[i] идет после элементов, которые вы назначили. Вы должны использовать i-3, i-2 и i-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]);
    }
}
...