std::cin ,不需要的行为。我该如何解决这个问题?

std::cin , unwanted behaviour. and how can I fix this?

我尝试使用一些代码来测试重载函数。重载部分进行得很顺利,但是,我学到了一些关于 std::cin 的东西,这让我觉得以前没有注意到它很愚蠢!

#include <iostream>
void read (int *var){
    std::cout<<std::endl<<" input :";
    std::cin>>*var;
}
void read (float *var){
    std::cout<<std::endl<<" input :";
    std::cin>>*var;
}
void read (char *var){
    std::cout<<std::endl<<" input :";
    std::cin>>*var;
}
void read (bool *var){
    std::cout<<std::endl<<" input :";
    std::cin>>*var;
}
int main(){
    int a;
    float x;
    char c;
    bool s;
//  std::cin>>a;
//  std::cin>>x;
//  std::cin>>c;
//  std::cin>>s;
    read (&a);
    read (&x);
    read (&c);
    read (&s);
    std::cout<<a<<std::endl<<x<<std::endl<<c<<std::endl<<s<<std::endl;
    return (0);
}

使用 g++ 编译时会发生以下情况:

$ g++ test1.cpp -o test
$ ./test

 input :1.2

 input :
 input :a

 input :0
1
0.2
a
0

我已经尝试了很多值并在它们之间添加了一些指令,但我仍然得到相同的行为,如果我尝试读取多个值,这很烦人,如果它们属于不同类型,则更多。

注释文本与下面的 'read' 函数基本相同,并且具有相同的行为。我正在使用一个函数,因为我只是想这样做 :D

这不是一个奇怪的行为,真正发生的是当这一行在 read int 函数中执行时:

 std::cin>>*var;

它需要来自您的键盘缓冲区的整数,当您将其作为输入输入时:

1.2

cin 对象读取第一个数字直到小数点,因为它是整数部分并将剩余字符留在缓冲区中,因此变量 a 将具有值 1 和字符 .2 将在缓冲区中被解除。

所以当 read float 函数执行时,它不会等待你的输入,因为缓冲区中已经有一个浮点数,所以它读取它并将它存储在变量中,所以它的值变成 0.2 .