我正在尝试从文件中读取一些整数,但是在运行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]);
}
答案 0 :(得分:0)
唯一可能导致调用strtol()
的行是对atoi()
的调用-调试器中的调用堆栈将确认这一点。
都在这里:
p = strtok(line, " ");
v[i] = atoi(p);
在这里:
p = strtok(NULL," ");
v[i] = atoi(p);
在将p != NULL
传递给atoi()
之前,您未能对其进行检查。来自Microsoft's documentation:
如果传入的参数为NULL,则无效的参数处理程序为 如Parameter Validation中所述被调用。如果允许执行 要继续,这些函数将errno设置为EINVAL并返回0。
对代码进行简单的重组既可以降低复杂性,又可以解决 不能检查NULL的问题:
p = strtok(line, " ");
while (p != NULL)
{
v[i] = atoi(p);
i++;
p = strtok(NULL," ");
}
代码始终是错误的,但是未定义的行为正是这样。这两个工具都包含调试器,即使Studio的C支持在1989年仍然存在,Visual Studio还是高级调试器。“调用堆栈”窗口将使您可以观察调用函数的局部变量(在这种情况下为main()
) ,您将看到p == NULL
。真;学习有效地使用调试器-比发布问题要快得多!