0

我正在尝试读取一个文件,然后读取每个字符,直到我到达一个新行,然后在该行上做一些工作。这是我到目前为止所做的:

  char line[] = "";
  char *charcter = "";

  //If i do this here it works fine, but below it's not working at all
  charcter = "asssss";
  strcat(line,charcter);

  //Read file
  inputFile = fopen(fileName,"r");
  if (inputFile) 
  {
    while ((charcter = (char)getc(inputFile)) != EOF)
           strcat(line,charcter); //This piece code keeps crashing my program on run

    fclose(inputFile);
  }

我是一名 C# 开发人员,我真的很沮丧,我无法弄清楚这件事,请帮忙。

编辑:

我已经修改了片段行并为它分配了内存,如下所示:

char *line = (char*)malloc( 400 *sizeof(char));

现在 while 循环中的 strcat 工作但在获取所有值后崩溃(输入比分配的内存小得多),如果我将相同的 strcat 语句放在 if 语句中,它将采用第一个字母然后崩溃。

那么这里的问题是什么?

4

2 回答 2

2

您正在尝试修改堆栈中数组中的字符串。您分配line[]""(即一个字节,null字符),然后尝试在内存上乱写strcat(这将修改其第一个参数指向的内存)。

当您将字符串放入源文本并将其分配给函数中的数组变量时,会在函数调用帧中的堆栈上分配大量内存。如果您在它之后访问内存,那么您将在堆栈的其他位上乱涂乱画,这不仅可以修改数据,还可以修改程序的行为。

这就像在 C# 中创建一个固定数组,然后尝试附加到它。该语言不会让您这样做,因为这将涉及覆盖在数组结束后发生的任何其他内存。C 会让你尝试,但随后崩溃,因为你在不属于你的内存上乱涂乱画,或者更糟糕的是,让你这样做,然后继续在未知状态下运行。谁知道在地址的几个字节之外还能找到什么line?你没有。

有关更多信息,请参阅此问题:字符串文字:它们去哪儿了?

一旦有了指向内存地址的指针,C 就只知道它是一个指针。它不知道它指向什么样的内存(静态常量、栈、堆),所以它会让你犯这个错误。当您确实犯了错误时,操作系统可能会通过引发分段错误来说“实际上不,这是不允许的”,或者如果它是一个更微妙的错误,它可能不会。

您应该分配一个大缓冲区malloc,足以容纳文件(危险)或重新分配缓冲区以每次扩展它。

编辑我意识到那line不是char[]a char*,所以编辑了我的答案。

于 2013-09-26T13:38:12.233 回答
2
  • 你不能strcat()是一个字符 - 你需要一个字符串
  • 字符变量的类型应该是int(检查原型getc()
  • 如果您仍想逐个字符地执行此操作,请考虑按索引将其添加到字符串中(最后以 NUL 终止)
于 2013-09-26T13:38:25.020 回答