我是 C++ 编码的新手。
我注意到,如果我为一个字符变量输入多个字符,那么下面给出的测试程序会进入无限循环。我无法正确调试此问题。有人可以帮我看看输入此类输入时程序的流程如何。我怀疑发生了一些不安全的转换。
有可能将溢出值作为下一个整数变量的输入,但我正在循环中检查变量并要求用户重新输入一个无效值。程序不会因为接受新的数字输入而停止。相反,它无限地打印“输入数字”。为什么 cin 不能接受新的输入?这个程序中是否有一些修改可以纠正这个错误?
#include <iostream>
int main()
{
char name;
int number=-1;
cout << "Enter a character: \n";
cin >> name; //Use input like abc here
cout << "number = " << number;
while (number == -1)
{
cout << "Enter a number: \n";
cin >> number; // This never waits for user input
}
return 0;
}
Output
Enter a character:
ytc
number = -1Enter a number:
Enter a number:
Enter a number:
Run Code Online (Sandbox Code Playgroud)
当用户在第一个查询中输入多个字符时,仅提取第一个字符并将其存储在name.
之后,进入循环。读取的第一个字符不是数字,因此流进入错误状态。所有后续读取都失败,因此number永远不会更改的值,并且您有一个无限循环。
以下程序将执行您想要的操作:
#include <iostream>
int main() {
char name = '\0';
int number = -1;
std::cout << "Enter a character: " << std::endl;
std::cin >> name;
std::cout << "You entered " << name << std::endl;
while(number == -1) {
std::cout << "Enter a number: " << std::endl;
if(!(std::cin >> number)) {
if(std::cin.eof()) {
std::cout << "User pressed CRTL+d" << std::endl;
break;
}
std::cout << "This was not a valid number - try again: " << std::endl;
std::cin.clear();
std::cin.get(); // extract one character
}
else
std::cout << "You entered " << number << std::endl;
}
}
Run Code Online (Sandbox Code Playgroud)
该条件if(!(std::cin >> number))检查提取是否成功。如果不是,则打印错误消息,清除流状态,并提取一个字符。后者是为了防止无限循环,因为如果我们从不提取坏字符,我们将一遍又一遍地得到相同的错误。
请注意,提取std::cin >> number将尝试提取代表数字的最长字符串。如果用户输入234t23432,那么它会提取234,因为t是不能解释为数字一部分的第一个字符。