程序终止前的多余空白行

时间:2018-10-18 11:07:28

标签: c

我真的是编程新手,只想问一个简单的问题。 因此,我制作了一个程序,该程序先读取用户输入的内容,然后输出完全相同的内容,直到用户按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;
}

现在,程序终止,而没有创建额外的空行。但是我似乎真的无法弄清楚导致两个代码发生差异的因素。

任何帮助将不胜感激。谢谢!

1 个答案:

答案 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并跳出循环而不打印换行符。