我尝试编写一个c程序来提示用户使用fgets()
函数输入一个字符串。
这是代码:
#include <stdio.h>
#define MAXLEN 10
int main (void){
char buffer[MAXLEN];
puts("Enter text a line at a time;enter a blank to exit.");
while(fgets(buffer,MAXLEN,stdin) != NULL){
printf("%s",buffer);
if(buffer[0]=='\n')
break;
}
return 0;
}
我的问题是为什么程序仍在运行并且不会导致任何未定义的行为?以来
MAXLEN=10
当我输入一个长度超过10个字符的字符串时,编译器不会告诉任何内容并继续打印所有字符串。
答案 0 :(得分:3)
并且不会导致任何未定义的行为?
对于一个,&#34;未定义的行为&#34;并不意味着崩溃。这意味着标准并不保证你任何东西。现在,无论是明显的还是壮观的(即导致崩溃或其他事情),仅仅是运气问题。
我输入了一个长度超过10个字符的字符串,编译器不会告诉任何内容并继续打印所有字符串。
编译器不会打印字符串,您的程序会这样做。编译器也不知道用户将输入的字符串的长度。
但是,您传递缓冲区大小fgets()
(作为其第二个参数)。 坦率地说,为什么你认为那个参数存在?它正是出于这个目的。 fgets()
不会读取比允许更多的字符(一次)。如果这是缓冲区大小(通常应该是这样),那么您将始终是安全的。
但是,如果您努力阅读fgets()
的文档,我相信您可以自己推断出来。
答案 1 :(得分:2)
通过在打印中添加换行符来修改代码:
printf("%s\n", buffer);
这样您就可以更准确地了解fgets()
的行为方式(并且它表现得非常好,因为它应该表现得很好)。
现在进入一条短线;你会看到它是双倍间距打印的(带有一个额外的换行符)。
现在去进入一条长线。您将看到打印的前9个字符,然后是第9个字符,依此类推,直到该行的最后几个字符被双倍打印。
请注意,如果您输入的行数是9个字符的倍数加上换行符,则循环将终止,因为fgets()
最终只会返回换行符,您的代码将其视为空行。