为什么当我只想要一个输入时,getchar()会接受两个输入?

时间:2015-11-29 23:34:38

标签: c io

我正在尝试只阅读一个字符,但我的循环继续抓住输入的密钥'输入'键。如何防止这种情况发生,只抓住第一把钥匙?这是一个例子:

#include <stdio.h>
#include <iostream>
#include <fstream>

using namespace std;

int rseed = 1448736593;

int main(int argc, char** argv) {

    printf("#Program started successfully with random seed %i\n", rseed);

    int c;
    while(true) {
        printf("input: ");
        c = getchar();
        printf("You selected %i\n", c); 
    }   
    return 0;
}

以下是代码给出的内容:

#Program started successfully with random seed 1448736593
input: 2
You selected 50
input: You selected 10
input: 3
You selected 51
input: You selected 10
input: 1
You selected 49
input: You selected 10
input: ^C

如何保持它还告诉我我选择了10?我希望保留这一点,因为当用户点击进入&#39;没有别的。

3 个答案:

答案 0 :(得分:1)

您获得的第二个值(10 - 换行符/换行符的十进制ASCII代码)是因为按Enter键产生的换行符。

最简单的解决方法:

c = getchar();
if (c != '\n') // or (c != 10)
    getchar(); // call again getchar() to consume the newline
printf("You selected %i\n", c); 

现在输出是:

input: 2
You selected 50
input: 3
You selected 51
input:              // <- Enter alone was pressed here
You selected 10
input: 1
You selected 49
input: ^C

但是在用户输入多个字符之前输入多个字符的情况在此处未处理,在这种情况下,每个第二个字符都将被忽略。

答案 1 :(得分:0)

char c = getchar();

当控制在上面的行上时,getchar()函数将接受单个字符。接受字符控制后仍保持在同一行。当用户按下回车键时,getchar()函数将读取该字符,并将该字符分配给变量'c'。

答案 2 :(得分:-1)

忽略换行符:

int getchar2(void) {
  int ret;
  do {
    ret = getchar();
  } while (ret == '\n');
  return ret;
}