c - 为什么当我们在下面的代码中逐行读取文件时程序会崩溃?

标签 c

int main()
{
    FILE *f;
    f=fopen("new1.c","r");
    for(;;)
    {
        char line[100];
        char *token;
        if (fgets(line, 80, f) == NULL) break;
        token = strtok(line, " -n");
        while (token) {
            // Do something with token, for example:
            printf("'%s' ", token);
            token = strtok(NULL, " -n");
        }
    }
    fclose(f);
    return 0;
}

我哪里出错了,请指导程序运行时也会出现一些警告,并且运行时程序崩溃。

最佳答案

警告和崩溃是因为您没有包含正确的头文件。

在 C99 标准之前,编译器可以在发现未声明函数时猜测其原型(prototype),虽然编译器经常获得正确的参数,但返回类型始终为 int .

现在接听 fopen 的电话,编译器会猜测参数是两个常量字符串( const char * ),但返回类型将是 int而不是FILE *正如预期的那样。这会导致问题,因为有符号整数和指针不是同一回事,并且如果您使用的是 64 位平台,其中指针是 64 位且 int通常是32位,你会遇到很大的问题。所有这一切导致undefined behavior这是崩溃的常见原因。

要解决您的问题,包括警告和崩溃,您需要 #include正确的头文件。对于文件函数( fopenprintf 等),它是 <stdio.h> ,对于字符串函数(例如 strtok ),它是 <string.h> .

始终包含 header 正确的头文件。如果您不知道标准函数应包含哪个头文件,请搜索例如this excellent reference site .

关于c - 为什么当我们在下面的代码中逐行读取文件时程序会崩溃?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31241580/

相关文章:

c - C 中的数组声明

c - 数据没有添加到 xml 节点?获取错误 : output error : invalid character value

c++ - 我想使用 64 位整数可以采用的完整范围。我如何在 x86 Visual Studio 2008 中执行此操作?

c - 在c中printf()返回什么

C程序编译错误: Undefined reference to function 'compare' ?

c++ - C语言中如何重复for循环

c 类型等价的编译器

c - scanf() 只有符号和数字

c - 没有标签的 switch 语句代码

c - 不允许我在 if 语句 C 中声明一个字符串