Единственная строка, которая может вызвать 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
. В самом деле;научитесь эффективно использовать отладчик - гораздо быстрее, чем отправлять вопросы!