提问人:med amine riahi 提问时间:1/16/2022 最后编辑:med amine riahi 更新时间:1/16/2022 访问量:107
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
我已经尝试了许多值并在两者之间添加了一些指令,但我仍然得到相同的行为,如果我尝试读取多个值,这很烦人,如果它们属于不同的类型,则更是如此。
注释文本与下面的“读取”功能基本相同,并且具有相同的行为。我正在使用一个函数,因为我只想这样做:D
答:
3赞
Bemwa Malak
1/16/2022
#1
这不是一个奇怪的行为,真正发生的事情是在 read int 函数中执行此行时:
std::cin>>*var;
它需要来自键盘缓冲区的整数,当您输入此整数作为输入时:
1.2
CIN 对象读取第一个数字,直到小数点,因为它是整数部分,并将剩余的字符留在缓冲区内,因此变量将具有值,并且字符将在缓冲区中被抬起。a
1
.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
这只会忽略剩余的部分。
评论
1.2
不是有效的整数。被读取,剩下的留给下一个 cin1
.2
std::cin
std::cout
std::cin
read()
std::cin
operator>>()