我真的是编程新手,只想问一个简单的问题。 因此,我制作了一个程序,该程序先读取用户输入的内容,然后输出完全相同的内容,直到用户按Enter键而没有任何输入。
int main(void) {
char s1[30];
while (s1[0] != NULL) {
gets(s1);
printf("%s\n", s1);
}
system("PAUSE");
return 0;
}
然后我意识到,当我按Enter键结束程序时,程序在程序终止之前会创建一个额外的空白行。
所以我更改了下面的代码
int main(void) {
char s1[30];
while (1) {
gets(s1);
if (s1[0] == NULL)
break;
printf("%s\n", s1);
}
system("pause");
return 0;
}
现在,程序终止,而没有创建额外的空行。但是我似乎真的无法弄清楚导致两个代码发生差异的因素。
任何帮助将不胜感激。谢谢!
答案 0 :(得分:1)
如评论部分所告知,请勿使用gets
,这很危险(why-is-the-gets-function-so-dangerous-that-it-should-not-be-used)。
并用gets
替换fgets
,如下所示。
while (fgets(s1,sizeof s1,stdin)) {
if (s1[0] == '\n') //fgets() reads the newline into the buffer
break;
printf("%s", s1); // Don't need to append \n to print as s1 will be having \n already.
}
回答您的问题
gets(s1);
if (s1[0] == NULL) // Not valid comparison use \0 instead of NULL
按enter
终止程序时,gets
不会将换行符(\n
)读入缓冲区,因此{{ 1}},并且将具有不确定的值(在您的情况下,它似乎具有s1
),因此您遇到gets
并跳出循环而不打印换行符。