我是编码的新手,我想知道为什么我的代码没有按照我的意图工作。我将代码构建为培训计划,以帮助我练习所学知识。正如我所期望的那样,当我在多行注释部分的第19-23行注释掉时,该代码似乎可以正常工作,但是当我不这样做时,它开始意外地起作用。
#include <iostream>
int askUserNumber ()
{
std::cout << "Please input a number: " << std::endl; //ask user to input number
int userNumber; //define integer to store input
std::cin >> userNumber; // get input from user
return (userNumber); // return input to caller
}
void printUserNumber (int userNumber)
{
std::cout << "Your number input was: " << userNumber << std::endl; //print input to user screen
}
int main ()
{
/*
std::cout << "Please input your name: " << std::endl; // ask user name
int userName; // variable to store user name
std::cin >> userName; // get user name
*/
printUserNumber(askUserNumber()); // call to askUserNumber to get user input to print to screen
return(0);
}
结果(不带注释代码):
请输入您的姓名:
科里
请输入数字:
您输入的数字是:“ someGarbageNumber”
它不允许我在该部分输入数字,而只是打印出随机数。
结果(带有注释代码):
请输入数字:
7
您输入的数字是:7
这次它运行完美,没有问题。我不明白为什么当要求printUserNumber(askUserNumber())的函数调用显示“请输入数字:”的三行要求用户名时,为什么不允许我输入数字,并且不允许我输入一个。感谢您的任何答复。我希望我能以一种很好的方式写出我的问题,并以清晰,直接的方式解释我的问题。希望结果部分将使您更加清楚。期待解决方案再次感谢。
答案 0 :(得分:4)
由于userName
是int
,而您正尝试使用std::cin
来读取其中的非数字字符序列,因此该操作失败并将std::cin
留在fail()
ed state,因此对operator>>
的以下std::cin
调用都不会成功提取其他输入字符。
它不允许我在该部分输入数字,而只是打印出一个 随机数。
在C ++ 11之前,行为是保持 rhs 不变,在您的情况下,这是未初始化的int
,因此在打印时会看到垃圾。
您可以在std::basic_istream::operator>>()
的参考资料中看到所有这些内容:
- 如果提取失败(例如,如果在期望数字的位置输入了字母),
value
保持不变,并且设置failbit
。 (直到C ++ 11)- 如果提取失败,则将零写入值并设置
failbit
。如果提取导致该值太大或太小而无法容纳value
,则写入std::numeric_limits<T>::max()
或std::numeric_limits<T>::min()
并设置failbit
标志。 (自C ++ 11起)
您仍然可以通过清除错误状态标志并忽略缓冲区中的内容来从流中的此类fail()
状态中恢复:
int main()
{
std::cout << "Please input your name: " << std::endl; // ask user name
int userName; // variable to store user name
std::cin >> userName; // get user name
if (!std::cin) // Check if `fail()`
{
std::cout << "input stream failure :-(" << '\n';
// Clearing flags and input buffer
std::cin.clear();
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
}
else
{
std::cout << "Your name input was: " << userName << '\n';
}
printUserNumber(askUserNumber()); // call to askUserNumber to get user input to print to screen
return 0;
}
输出:
Please input your name:
input stream failure :-(
Please input a number:
Your number input was: 7
例如,使userName
成为std::string
就是获得所需行为的解决方案。在这种情况下,the above code produces the output:
Please input your name:
Your name input was: Corey
Please input a number:
Your number input was: 7