[英]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
將計算為4
或8
。 在您的情況下,它似乎是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.