簡體   English   中英

使用 fgets 時沒有打印出來

[英]Not being printed out when using fgets

我正在學習 C 中的文件輸入/輸出。 但是有一點我不明白。
我正要使用 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;
}

output 是“這個 sp”

我以為我的代碼沒有問題,但是 output 結果出乎意料。

我的意思是,為什么沒有打印出整個字符串?
另外,這個 output 字符串的原因是什么?
(似乎沒有跡象表明這段代碼會有 7 個字符,即“ This sp ”)

您的緩沖區被聲明為char*而不是固定大小的數組,因此sizeof(buffer)為 8,因此讀取和打印了 7 個字符(加上'\0' )。 sizeof無論如何都不知道您向malloc詢問了多少字節。 我認為當您開始學習指針並意識到 arrays 像指針一樣工作但不完全一樣時,這是最令人困惑的事情。

解決方案:

fgets(buffer, 100, fp);

或者

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

由於您將buffer聲明為char *buffer ,因此它不是數組。 相反,它只是一個指針。

表達式sizeof buffer將計算指針本身的大小,而不是指針指向的 object 的大小。 由於指針的大小通常為 32 或 64 位,因此表達式sizeof buffer將計算為48 在您的情況下,它似乎是8

如果您像這樣聲明了buffer

char buffer[100];

那么buffer將不是一個指針,而是一個數組,並且表達式sizeof buffer將被評估為100

在您的情況下,使用malloc而不是數組沒有任何問題。 但是,如果您使用malloc ,您必須自己記住分配的 memory 的大小。 您不能為此使用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更改為其他數字,您只需在代碼中的一個位置更改數字,而不是幾個位置。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM