2014-10-27 112 views
0

我可以從stdinscanf("%s", &input)中讀取文件內容。使用scanf從stdin C讀取文件

如果我不知道文件的時間長度,我應該爲input字符串分配多少空間?

+0

字符串需要char *。離開'&'。看看使用fgets而不是scanf。這將防止緩衝區溢出,但如果真的需要,你可以分配一個安全數量的字符來讀取,比如scanf(%255s「,input); – LeatherFace 2014-10-27 16:24:20

+0

沒有誠實的說法。 – luk32 2014-10-27 16:24:31

+0

建議每次讀取1行,並建立1000行的最大行長 - 至少是你認爲可能需要的2倍的值,然後使用'fgets()',緩衝區大小應爲1000 + 2 (或者可能是+3),可以編寫代碼來處理任意長的行,但IMO應該檢測到過長的行,並將其視爲錯誤代碼 – chux 2014-10-27 16:35:01

回答

1

考慮使用fgets而不是scanfscanf可能會導致溢出,但您可以告訴fgets您想要讀取的最大大小。如果您需要scanf進行格式掃描,則仍然可以在fgets之後使用sscanf

char * fgets (char * str, int num, FILE * stream); 
1

你應該改變這個問題。你分配一個規定大小的緩衝區,並限制輸入,與scanffgets一樣。

#define SIZE 256 
char buf[SIZE]; 
fgets(buf, SIZE, stdin); 

scanf("%255s", buf); 

,然後迭代讀取。

使用fgets而不是scanf取決於您的輸入是面向行的還是空間分隔的。並且... RTFM ...

+0

這一行:char buf [SIZE];將是一個c由於fgets會在緩衝區末尾添加一個終止'\ 0',所以該行應該是:char buf [SIZE + 1]; – user3629249 2014-10-27 23:00:20

+0

@ user3629249不,根據手冊頁* fgets()最多隻讀取一個小於流*中的大小字符。這裏最多可以讀取255個字符,並且會有一個終止'\ 0'的地方。 – 2014-10-28 06:45:21