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

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

提问人:med amine riahi 提问时间:1/16/2022 最后编辑:med amine riahi 更新时间:1/16/2022 访问量:107

问:

我尝试使用一些代码来测试重载函数。重载部分进行得很顺利,但是,我学到了一些关于 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

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

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

C++ IOSTREAM CIN 到iStream

评论

2赞 drescherjm 1/16/2022
1.2不是有效的整数。被读取,剩下的留给下一个 cin1.2
1赞 digito_evo 1/16/2022
"std::cin 函数“,不是函数。它是一个全局对象:std::cin、std::wcinstd::cin
0赞 Peter 1/16/2022
注释的代码不会向 写入任何提示。但它确实以同样的方式读取。工作版本过载,因为 I/O 流对象(如 )的重载为 。std::coutstd::cinread()std::cinoperator>>()

答:

3赞 Bemwa Malak 1/16/2022 #1

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

 std::cin>>*var;

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

1.2

CIN 对象读取第一个数字,直到小数点,因为它是整数部分,并将剩余的字符留在缓冲区内,因此变量将具有值,并且字符将在缓冲区中被抬起。a1.2

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

评论

0赞 med amine riahi 1/16/2022
我有点知道它正在存储它没有在某处读取的部分,但我想删除它,这样我以后就不会遇到任何错误。
0赞 Bemwa Malak 1/16/2022
您可以使用 但您必须包括cin.ignore(numeric_limits<streamsize>::max())#include <limits>
1赞 Bemwa Malak 1/16/2022
numeric_limits<streamsize>::max() sets the maximum number of characters to ignore. Since this is the upper limit on the size of a stream, you are effectively telling cin that there is no limit to the number of characters to ignore.
0赞 Bemwa Malak 1/16/2022
这只会忽略剩余的部分。