我正在學習 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;
}
輸出是“這個sp”
我以為我的代碼沒有問題,但輸出結果卻出乎意料。
我的意思是,為什么不列印出整個字串?
另外,這個輸出字串的原因是什么?
(似乎沒有跡象表明此代碼將有 7 個字符,即“ This sp ”)
uj5u.com熱心網友回復:
您的緩沖區被宣告為 achar*而不是固定大小的陣列,因此sizeof(buffer)是 8,因此'\0'讀取和列印7 個字符(加上 a )。反正sizeof不知道你要求多少位元組malloc。我認為當你開始學習指標并意識到陣列像指標一樣作業但又不完全是時,這是最令人困惑的事情。
解決方案 :
fgets(buffer, 100, fp);
或者
char buffer[100];
fgets(buffer, sizeof(buffer) fp);
uj5u.com熱心網友回復:
由于您宣告buffer為char *buffer,因此它不是陣列。相反,它只是一個指標。
該運算式sizeof buffer將計算指標本身的大小,而不是指標指向的物件的大小。由于指標的大小通常為 32 位或 64 位,因此運算式的sizeof buffer計算結果為4或8。在你的情況下,它似乎是8.
如果你buffer像這樣宣告
char buffer[100];
thenbuffer不會是一個指標,而是一個陣列,并且運算式的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其他數字,則只需在代碼中的一處更改數字,而不是多處。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/368915.html
