Почему мой код не работает в Visual, но работает в CodeBlocks? - PullRequest
0 голосов
/ 19 октября 2019

Я пытаюсь прочитать некоторые целые числа из файла, но в Visual Studio Code 2013, когда я запускаю его, я получаю сообщение об ошибке «Ошибка отладки утверждения! Программа: ... cuments \ visual studio 2013 \ Projects .... \ strtol.c Строка: 94 Выражение: nptr! = NULL

Этот же код работает довольно хорошо в CodeBlocks. Я только недавно начал использовать Visual, так что я не очень хорош в этом. содержимое файла, который я пытаюсь прочитать: 11 7 4 1 4 0 10 12 1 3 9

#include <stdio.h>
#include <stdlib.h>
#include <string.h>


FILE *f;
void main(void) {
    int v[30], i = 0;
    char line[30], *p;
    f = fopen("Text.txt","r");

    fgets(line, 30, f);
    p = strtok(line, " ");
    v[i] = atoi(p);
    i++;
    while (p != NULL){
        p = strtok(NULL," ");
        v[i] = atoi(p);
        i++;
    }

    int n = i-1;
    for (i = 0; i < n; i++)
        printf("%d ", v[i]);

}

1 Ответ

0 голосов
/ 19 октября 2019

Единственная строка, которая может вызвать strtol(), - это вызов atoi() - стек вызовов в отладчике подтвердит, что.

Оба здесь:

p = strtok(line, " ");
v[i] = atoi(p);

и здесь:

    p = strtok(NULL," ");
    v[i] = atoi(p);

вы не можете проверить p != NULL перед передачей его на atoi(). Из документации Microsoft :

Если переданный параметр имеет значение NULL, вызывается недопустимый обработчик параметров, как описано в Проверка параметров . Если выполнение может быть продолжено, эти функции устанавливают для errno значение EINVAL и возвращают 0.

Простая реорганизация вашего кода уменьшит сложность и и устранит ошибку проверки на NULL. :

p = strtok(line, " ");
while (p != NULL)
{
    v[i] = atoi(p);
    i++;
    p = strtok(NULL," ");
}

Код всегда был неправильным, но неопределенное поведение - именно это. Оба инструмента включают отладчик, Visual Studio является превосходным отладчиком, даже если его поддержка C застряла в 1989 году. Окно стека вызовов позволит вам наблюдать локальные переменные вызывающей функции (в данном случае main()), ивы увидели p == NULL. В самом деле;научитесь эффективно использовать отладчик - гораздо быстрее, чем отправлять вопросы!

...