2009-06-04 90 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