2013-06-26 25 views
2

我已经的大小的输入通过许多职位上SO关于在scanf()优选使用的fgets()gets()。有的称为关于与fgets()man page与fgets()不保留“ n”的阵列

再有就是this wonderful post表示利用作为在手册页FGETS(描述中提到这个职位的答案strlen()。一是通过fgets()存储的字符数)保留\n(如果有的话),这就是为什么strlen()函数返回text_size + 1。我试图通过一个程序来测试它:

#include<stdio.h> 
#include<string.h> 
#define text_size 10 
int main(void) 
{ 
    char str[text_size+1]; 
    fgets(str,sizeof(str),stdin); 
    printf("%s",str); 
    printf("%d",strlen(str)); 

    return 0; 
} 

当我大小比text_size较小的输入文本时,strlen(str)返回值(text_size + 1)阅读手册页,它保留了后是完全可以理解我文字后的\n。如对实施例: -

INPUT:你好

OUTPUT:您好6(我想\ n被这里保留)。

但是,当作为text_size或确切大小的I输入文本甚至更大的尺寸由strlen(str)返回的值等于(text_size),因此10被打印出来,不知为什么\n此处丢弃?

输入:helloworldhi

OUTPUT:HelloWorld的10(为什么这里没有返回11日以来1米字元的地方还是有的,这里我就不明白它在这里被赋予优先\0\n字符和为什么???

我不是很肯定在C中的所有未定义的行为,但我们可以把它叫做一个UB?

回答

2
fgets(str,sizeof(str),stdin); 

您可以指定缓冲区的大小,因此当有太多睦h文本,它只能读取(大小为1)字符,为空字符腾出空间。

看一看fgets

读取来自流的字符,并将它们存储为C字符串到STR直到(NUM-1)的字符已被读出或任一换行或最终的文件是达到,以先发生者为准。

+0

+1链接。谢谢!! – 0decimal0

+0

确定然后printf()语句应该只打印文本大小为1? – 0decimal0

+1

@PHIfounder它应该在您的示例中打印最大尺寸为-1的文本(或者更确切地说是'text_size')。 –