我是编码新手,想知道为什么我的代码没有按照我想要的方式运行。我将代码构建为培训计划,以帮助我练习所学的知识。正如预期的那样,当我注释掉第 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);
}
结果(不注释掉代码(:
请输入您的姓名:
科里
请输入一个数字:
您的数字输入是:"some垃圾号码"
它不允许我在该部分输入数字,它只是打印出一个随机数。
结果(带注释掉代码(:
请输入一个数字:7 您的号码输入是:
7
这次它运行完美,没有问题。我不明白为什么要求用户名的三行导致它不允许我输入一个数字,当 printUserNumber(askUserNumber((( 的函数调用达到它打印"请输入一个数字:"并且不允许我输入一个。感谢您的任何回复。我希望我以良好的格式写下我的问题,并以清晰直接的方式解释我的问题。希望结果部分也能提供一些清晰度。期待解决方案再次感谢。
由于userName
是一个int
,并且您尝试使用std::cin
将一系列非数字字符读入其中,因此操作失败并使std::cin
处于fail()
ed 状态,因此以下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
。在这种情况下,上面的代码会产生输出:
Please input your name:
Your name input was: Corey
Please input a number:
Your number input was: 7