【问题标题】:Terminal: segmentation fault 11 while reading file and counting the amount of vowels终端:读取文件和计算元音数量时出现分段错误 11
【发布时间】:2014-09-12 02:30:33
【问题描述】:

终端一直说:segmentation fault 11。 我的代码是:

int main()
{
    FILE *file;
    file=fopen("test.txt","r");
    int c;
    int vowelCount=0;

    while ((c=getc(file)!=EOF)) {

        if( c=='a' | c=='e' | c=='i'| c=='o' | c=='u')
        {

            vowelCount++;
        }
    }
    printf("%d",vowelCount);
    return 0;
}

【问题讨论】:

  • 尝试调试你的程序
  • 另外你需要检查file == NULL是否在fopen之后但在getc之前
  • 您正在泄漏文件句柄 - 您永远不会关闭文件。
  • (c=getc(file)!=EOF) 更改为(c = getc(file)) != EOF 可能会获得更好的结果,尽管这不会导致段错误
  • @chux:#include <stdio.h> 仅在问题中显示的代码中丢失;如果没有有效定义 FILE * 的内容,代码将无法编译。在代码中进行核心转储的唯一原因是无法打开文件,然后在getc() 中使用空指针。一旦经过测试,代码将永远找不到任何元音,因为 c 将在每次通过循环时为 1 (通过整理分配和比较以及条件中的括号来修复)。当然,最后的 printf() 应该包含换行符。

标签: c file segmentation-fault


【解决方案1】:

您的代码中有几个问题:

  • 您错误地用括号括住了循环条件 - 它应该是 while ((c=getc(file))!=EOF)
  • 您在if 条件中使用了| 而不是||
  • 您没有检查fopen的返回值:如果由于文件不存在或其他原因导致函数失败,则返回NULL。尝试将 NULL 传递给 fgetc 会导致崩溃。

这是可能导致崩溃的最后一项。确保文件test.txt 位于您运行程序的目录中。

Demo.

【讨论】:

  • 奇怪的是,虽然|而不是||不是一个好主意,但这并不影响结果的正确性;它只会导致执行不必要的代码。
【解决方案2】:

检查文件是否 == NULL。

file=fopen("test.txt","r");
if (file == NULL) {
    return -1;
}

如果当前目录中不存在文件,则很可能会发生这种情况。因此,请正确指定文件的路径,从您需要读取文件的确切位置。

例如:

file = fopen ("/home/xpeng/test.txt", "r");

确保文件存在。

那应该没问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-08-14
    • 2015-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多