【问题标题】:How to use fscanf for reading files in c(Segmentation Fault)?如何使用 fscanf 读取 c(Segmentation Fault) 中的文件?
【发布时间】:2016-08-22 11:02:37
【问题描述】:

我是stackoverflow 的新用户。我用c写了这段代码,没有问题,输出是正确的。

#include <stdio.h>
#include <stdlib.h>

int main()
{
   char *str[10];
   FILE * fp;

   fp = fopen ("file.txt", "w+");
   fputs("We\nare\nin\n2016", fp);

   rewind(fp);

   fscanf(fp, "%s", str[0]);
   fscanf(fp, "%s", str[1]);              

   printf("Read String1 |%s|\n", str[0] );
   printf("Read String2 |%s|\n", str[1] );

   fclose(fp);

   return(0);
}

但是当我使用 char *str[15] 而不是 char *str[10] 时,结果是分段错误。怎么了?

【问题讨论】:

  • str 数组中的每个指针指向哪里?仅仅因为具有未定义行为的程序似乎可以工作并不意味着它是正确的。
  • 为什么这对于 str[10] 是正确的?我也初始化了str[15],但是不行
  • 它是 not 正确的,例如char *str[10],这似乎只是纯粹的运气(好运或坏运是一个观点问题)。它只是似乎起作用,您仍然会看似随机地覆盖一些内存。请记住,不幸的是,未定义行为的可能症状之一是它确实有效。

标签: c filestream scanf


【解决方案1】:

指针str[0]str[1] 未初始化。因此,您的程序有未定义的行为

您需要使用malloc() 进行分配,或者将它们设为具有固定长度的数组数组(例如str[2][256];),足以满足您从文件中读取的字符串。 无论如何,我会亲自使用fgets() 而不是fscanf(),然后根据需要解析该行。

它还有助于对所有函数(fopen()、fscanf() 等)进行错误检查。

【讨论】:

  • 为什么这对于 str[10] 是正确的?我也初始化了str[15],但是不行
  • char *str[10] 是一个指针数组,这些指针未初始化。它们没有指向您可以写入的任何内存。因此,您需要使用以下内容进行初始化:str[0] = malloc(256); str[1] = malloc(256);(或使用答案中所述的数组)。
【解决方案2】:

请记住,您正在声明 char * str[10],您正在为十个指针保留内存,但您没有调用 malloc 为这些指针的内容保留内存。

您的示例似乎类似于函数 fscanf 的本教程,http://www.tutorialspoint.com/c_standard_library/c_function_fscanf.htm

但是,字符串部分被声明为 char[10] 而不是 char *[10] 这意味着它们已经为 10 个字符保留了内存。在同一个示例中,读取长度大于 10 的字符串也会产生问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多