【问题标题】:Why do I get a segmentation fault when getting file name using user input?为什么在使用用户输入获取文件名时出现分段错误?
【发布时间】:2016-03-27 03:09:26
【问题描述】:

我会将代码剥离到我遇到问题的部分。

当我执行以下操作时,代码有效

int main() {        
    FILE * fptr1 = fopen("in.txt", "r");
    fread(data, sizeof(char), size, fptr1);
    .
    .
    .
    FILE * fptr2 = fopen("out.txt", "w");
    fwrite(data, sizeof(char), size, fptr2);
    fclose(fptr2);
}

但是当我使用 fgets 或 scanf 获取输入和输出文件名时,出现分段错误。

int main() {

    char inputfile[100];
    char outputfile[100];
    printf("name of input file: \n");
    fgets(inputfile, 100, stdin);
    printf("name of output file: \n");
    fgets(outputfile, 100, stdin);
    .
    .
    .
}

我玩这个已经有一段时间了。我尝试使用 scanf 并尝试更改输入文件和输出文件的分配大小,但我不断收到:

Segmentation fault (core dumped)

【问题讨论】:

  • 检查inputfileoutputfile。它们是否包含终止 '\n'
  • 好的,但是\n 会导致分段错误吗?据我所知,分段错误是由访问分配内存之外的内存引起的。 \n 不应该只是因为名称错误而导致程序无法找到文件吗?

标签: c input user-input


【解决方案1】:

使用fgets(),生成的文件名inputfileoutputfile 包含终止换行符。它导致以下fopen()失败并返回NULL

但是,您在调用fread()fwrite() 之前没有检查FILE* 的无效性,这导致了分段错误。

【讨论】:

    【解决方案2】:

    使用fgets() 输入的字符串包含一个终止符'\n',这通常是意料之外的。虽然这不会直接导致段错误,但它可能会导致fopen() 返回NULL,因为它找不到该文件。尝试从空文件指针读取数据会导致段错误。

    添加

    if(fptr1 == 0)
    {
        perror("fopen()");
        exit(EXIT_FAILURE);
    }
    

    在您的 fopen() 声明之后。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-27
      • 1970-01-01
      • 1970-01-01
      • 2015-10-22
      相关资源
      最近更新 更多