2009-06-04 64 views
1

char first [10];fscanf - 使用過長的字符串

char second [10];什麼是fscanf(fr,「%s%s \ n」,第一,第二);當第一個字符串太長時呢?

我可以只使用char *先不使用malloc嗎?指針會顯示給字符串?

回答

3

您可以使用寬度(即「%9s」)來限制字符串的大小。例如,請參見Microsoft's documentation

使用指針而不將它初始化爲任何東西是確保程序崩潰或以其他方式表現不佳的一種方法。

+0

但我可以有比10更小的字符串。在這種情況下,我不會明白這一切。 – feiroox 2009-06-04 20:21:08

+1

從文檔:「如果在達到寬度之前發生空格字符(空格,製表符或換行符)或無法根據給定格式進行轉換的字符,則可能會讀取少於寬度字符。」 – 2009-06-04 20:31:18

+1

還有一件事 - 給予fscanf的寬度應該小於字符串的大小,以允許空終止符。我會更新我的例子。 – 2009-06-04 20:32:30

1

當第一個字符串是太長,你遇到了你問題的第二部分buffer overflow.

作爲的問題,如果你不使用malloc,那麼它將被指向垃圾內存。字符串可能會停留一段時間,但不能保證,如果該內存段被別的東西使用,則會丟失字符串。

2

如果您使用glibc,您可以一次解決兩個問題 - 使用%as格式說明符。

它會自動分配足夠大的字符串來容納內容。

像這樣:

char *first, *second; 

scanf(fp, "%as %as\n", first, second); 

注:這是GNU擴展!

+0

嗨,謝謝。這是可惜的,它不在Windows下:) – feiroox 2009-06-04 21:27:13