为什么我的代码在Visual中不起作用,但在CodeBlocks中起作用?

时间:2019-10-19 14:24:54

标签: c visual-studio-2013 file-read

我正在尝试从文件中读取一些整数,但是在运行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 :(得分: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。真;学习有效地使用调试器-比发布问题要快得多!