c - 从 C 中的输入文件逐个读取字符?

标签 c strcat

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

  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# 开发人员,我真的很沮丧,我无法弄清楚这件事,请帮忙。

编辑:

我已经修改了 piece 行并像这样为其分配了内存:

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

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

那么这里有什么问题呢?

最佳答案

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

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

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

有关更多信息,请参阅此问题:String literals: Where do they go?

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

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

编辑 我意识到 linechar[] 而不是 char*,所以编辑了我的答案.

关于c - 从 C 中的输入文件逐个读取字符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19029852/

相关文章:

c - 终止(可能)多字节字符串?

c - 在 C 中显示原始值的字节表示

c - 三元运算符始终为假

自定义 STRCAT 被太多参数淹没

c - strcat(a[1] ,"22") 如何使用? C语言编程

C - 访问结构中的变量

c++ - 通过套接字发送的内容的数据类型是什么?

在C中创建字符串

c - 带有两个 0x00 字节前缀的 unsigned char 指针数组

c - 如何在 System() 命令中使用字符串