使用 fgets 时未打印出来

Not being printed out when using fgets

我正在学习 C 中的文件 input/output。但有些地方我不明白。
我正要使用 fgets [words.txt] 中打印简单的句子 ,但它不起作用。

[words.txt]如下:

This speech caused a remarkable sensation among the party.

我的代码是:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
    char *buffer = malloc(100);
    memset(buffer, 0, 100);

    FILE *fp = fopen("words.txt", "r");

    fgets(buffer, sizeof(buffer), fp);

    printf("%s\n", buffer);

    fclose(fp);

    free(buffer);

    return 0;
}

输出为“This sp”

我以为我的代码没有问题,结果输出结果出人意料。

我的意思是, 为什么没有打印出整个字符串?
另外,这个输出字符串是什么原因?
(似乎没有迹象表明这段代码会有7个字符,即“This sp”)

您的缓冲区声明为 char* 而不是固定大小的数组,因此 sizeof(buffer) 为 8,因此读取和打印 7 个字符(加上 '[=14=]')。 sizeof 不知道你向 malloc 请求了多少字节。当你开始学习指针并意识到数组像指针一样工作但又不完全是时,我认为这是最令人困惑的事情。

解决方案:

fgets(buffer, 100, fp);

char buffer[100];
fgets(buffer, sizeof(buffer) fp);

由于您将 buffer 声明为 char *buffer,因此它不是数组。相反,它只是一个指针。

表达式sizeof buffer 将计算指针本身的大小,而不是指针指向的对象的大小。由于指针的大小通常为 32 位或 64 位,因此表达式 sizeof buffer 的计算结果为 48。在你的情况下,它似乎是 8.

如果你声明了 buffer 而不是像这样

char buffer[100];

那么 buffer 将不是一个指针,而是一个数组,表达式 sizeof buffer 的计算结果将是 100.

在您的情况下,使用 malloc 而不是数组没有任何问题。但是,如果使用malloc,则必须自己记住分配内存的大小。您不能为此使用 sizeof 运算符。

您可以为此使用预处理器宏,而不是在代码的多个位置写入数字 100

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

#define ALLOCATION_SIZE 100

int main()
{
    char *buffer = malloc( ALLOCATION_SIZE );
    memset(buffer, 0, ALLOCATION_SIZE );

    FILE *fp = fopen("words.txt", "r");

    fgets(buffer, ALLOCATION_SIZE, fp);

    printf("%s\n", buffer);

    fclose(fp);

    free(buffer);

    return 0;
}

这样做的好处是,如果您决定将数字 100 更改为其他数字,您只需在代码中的一个地方更改该数字,而不是几个地方。