c - 来自简单 c while 循环的意外行为

标签 c

我已经喜欢使用 GNU Linux 大约一年了,并且认为我可以通过更多地了解编程语言 C 来更深入地研究,许多 Linux 内部组件都是用这种语言编写的。今天,我编写了一个简单的程序,本应帮助我理解 while 循环,但却让我感到困惑。该程序的目标非常简单:要求用户每行输入一个字符,直到他们输入“魔法”字符“g”,此时应用程序将关闭。这是我写的:

#include <stdio.h>

int main(int argc, char*argv[])
{
    char user_input;

    while (user_input != 'g') {
        printf("Please enter a character: ");
        scanf("%c", &user_input);
    }

    printf("You guessed the magic char, \'g\'!\n");

    return 0;
}

我预计应用程序在运行时会如下所示:

Please enter a character: d
Please enter a character: dddd
Please enter a character: g
You guessed the magic char, 'g'!

但是,这是我得到的行为:

Please enter a character: d
Please enter a character: dd
Please enter a character: Please enter a character: Please enter a character:
Please enter a character: Please enter a character: Please enter a character: g

似乎,当应用程序遇到“n”个字符的输入时,它会将“请输入一个字符:”附加到其输出“n”次。任何人都可以解释为什么会发生这种情况以及我可以做些什么来防止这种行为?

根据 L.P. 的回答,我修改了我的代码如下:

#include <stdio.h>

void clear_buffer();

int main(int argc, char *argv[])
{
    char user_input = '\0';

    do {
        printf("Enter guess: ");
        scanf("%c", &user_input);
        clear_buffer();
    } while (user_input != 'g');

    return 0;
}

void clear_buffer()
{
    while(getchar() != '\n' && getchar() != EOF);
}

但是,当我输入如下内容时: 请输入字符:dddd 然后按回车,我得到一个空白的换行符,直到我再次按回车...有没有办法解决这个问题?

最佳答案

两件事。 一:永远不要对未初始化的变量运行测试。 二:清除缓冲区。这是一个小烦恼。这就是你有这种行为的原因。 虽然我同意上面的代码片段,但我有一个习惯,不喜欢直接放置这样的东西,因为它的使用量很大,所以应该把它做成一个函数。

void clearBuffer() {                                   
  int c;                   
  while(((c = getchar()) != '\n') && (c != EOF));                                                     
} 

一开始忘了补充,在使用 scanf() 函数扫描字符后,您应该运行 clearBuffer() 函数。

切勿在未先初始化变量的情况下在 c 中测试变量,或在大多数其他语言中进行良好实践。

所以你应该使用 do-while 循环而不是 while 循环。正如上面评论中所说,这将有助于避免您的代码出现意外行为,并且在事情开始变得更加复杂时是一种总体上的好做法。

关于c - 来自简单 c while 循环的意外行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31496893/

相关文章:

c - C语言中的fputc在遇到字符 "d5dc"时将错误的数据写入文件

concat char* 与 char netbea

c - Vigenere Cipher 只能在处理 C 中的空格 ("") 之前有效 - 为什么?

c - 自由(): invalid pointer when freeing a 2d pointer

c - 将字符串发送到另一个应用程序的最简单方法是什么? (赢得API)

c++ - 这个外部无害吗?

c - 系统函数调用时出现段错误

c - 逐个字符打印标准输入直到文件末尾

c - 在C函数中传递不同的数据成员

c - C字符串在内存中的表示和比较