为具有空终止字符的 fgets 分配内存字符串

Byo*_*Tic 1 c string null fgets

如果这个问题看起来“简单”,我真的很抱歉,但我在任何地方都找不到答案。我尝试使用 fgets() 从文件中读取一行。为了确保没有空间被浪费,首先我找到了线的长度:

do
    {
        c= getc(file);
        words++;
    }while (c!=EOF && c!='\n');
Run Code Online (Sandbox Code Playgroud)

然后我为精确的单词数分配了内存:

char* line = (char*)malloc(sizeof(char)*(words));
Run Code Online (Sandbox Code Playgroud)

然后,我使用 fgets() 将行读取到行缓冲区。但问题是,这是有效的。但我一直认为你也应该为空终止字符分配内存。那么这里发生了什么?

Pab*_*ruz 5

确实需要为空终止符分配空间。这有效的事实并不意味着它总是会(至少在 C 中)。

另外,fgets还返回\n字符。所以你需要两个额外的字符。一为\n一为\0

不过,我会推荐这种方法:

char buffer [1024];
if ( fgets (buffer, 1024, f) != NULL ) {
   // so something with buffer
}
Run Code Online (Sandbox Code Playgroud)

  • @ user3050072 它不起作用。它*假装*正在工作。这是未定义的行为。“未定义”的意思是“未定义”而不是“定义为崩溃”。另外,为什么对空间如此认真?1024 字节不会受到伤害...您是否测量过这个特定的空间量会导致性能瓶颈?如果没有,那就不要担心。 (2认同)
  • `fgets (buffer, 1024, f)` 没问题,但建议使用 `fgets (buffer, sizeof buffer, f)` 更好。+1 为正确的方法。 (2认同)