gpt4 book ai didi

c++ - 首先 while 循环的第一次迭代总是无法接受输入。 2+循环工作正常

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:20:16 25 4
gpt4 key购买 nike

错误始于 cin.getline ( string, 25, '\n' );或它下面的行(strtod)。如果我使用 cin,它可以工作,但我无法退出。如果我输入任何不是 double 的东西,就会运行一个无限循环。需要帮忙。基本上,第一次迭代运行时不要求输入,因此用户会弄错数学题。第二次迭代工作正常。下一个也很好。如果我退出,使用 q,我会被转回模式选择器。选择模式后,错误会在第一次迭代时再次出现。下一次迭代它消失了。

int main()
{
char choice, name[25], string[25], op;
int operator_number, average, difference, first_operand, second_operand, input, answer, total_questions = 0, total_correct = 0;
double dfirst_operand, dsecond_operand, dinput, danswer, percentage;
bool rounding = false;

srand ( time(NULL) );

cout << "What's your name?\n";
cin.getline ( name, 25, '\n' );
cout << '\n' << "Hi, " << name << ".";

do {
do {
cout << "\nWhich math operations do you want to practice?\n 1. Addition\n 2. Subtraction\n 3. Multiplication\n 4. Division\n 5. Mixed\n 6. Difference of squares multiplication.\nChoose a number (q to quit).\n";
cin >> choice;
} while( choice < '1' || choice > '6' && choice!= 'q');

cout << "\n";

switch(choice) {
case '1':
while( string[0]!= 'q') {
dfirst_operand = rand() % 15 + 1;
dsecond_operand = rand() % 15 + 1;
danswer = dfirst_operand + dsecond_operand;
cout << dfirst_operand << " + " << dsecond_operand << " equals?\nEnter q to quit.\n";
cin.getline ( string, 25, '\n' );
dinput = strtod( string,NULL);
//cin >> dinput;
if(string[0]!='q') {
++total_questions;
if(dinput==danswer) {
++total_correct;
cout << "Correct. " << total_correct << " correct out of " << total_questions << ".";
} else {
cout << "Wrong. " << dfirst_operand << " + " << dsecond_operand << " equals " << danswer << ".\n" << total_correct << " correct out of " << total_questions << ".";
};
percentage = floor(10000 * (float) total_correct / total_questions)/100;
cout << ' ' << percentage << "%.\n\n";
}
}
break;
}
} while(choice!='q');
return 0;
}

最佳答案

问题是这一行:

 cin >> choice;

此行解析输入缓冲区以获取可转换为整数的字符输入。所以如果你输入:

2<newline>

字符串“2”被转换,<newline>保留在输入缓冲区中;因此后续的 cin.getline() 立即得到满足。

这也是 JonH 的建议不起作用的原因,您需要在 cin << choice 之后 清除输入缓冲区输入。另一种方法是对所有输入使用 cin.getline() (或更好;使用对 std::string 而不是 C 字符串进行操作的::getline() ),然后在以下情况下使用 std::istringstream 对象解析该输入你需要格式化输入扫描。

但是如果你必须使用 cin.ignore() 来解决这个问题,你应该这样做:

cin.ignore( std::numeric_limits<std::streamsize>::max(), '\n' ) ;

其中 std::numeric_limits 在 header 中定义。您的解决方案相信用户不会输入超过 25 个字符。这不是一个非常安全的假设。

关于c++ - 首先 while 循环的第一次迭代总是无法接受输入。 2+循环工作正常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2389663/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com