【发布时间】:2019-09-23 15:14:54
【问题描述】:
要从 shell 接收包含在 (0, 8) 区间内的整数值,我将 cin 转换为数组的 uint8_t 元素,执行以下操作:
char answer;
do
{
// Instructions
std::cout << "Linear actuator resolution is:\n"
<< "\u0394x = \u03B1r/2^i, with \u03B1 = " << std::to_string(ALPHA)
<< " degrees, r = " << std::to_string(pulleyR) << " m and i in [0 : 8]\n";
// Parameter selection
std::cout << "Please enter a valid value for param 'i': ";
std::cin >> Engines_uSteppingLevel[RAIL];
if(Engines_uSteppingLevel[RAIL] > (RES_LEVELS - 1))
// Wrong selection, repeat question
std::cout << '\r';
else
{
// Print out the selected resolution and ask user to confirm or restart selection
std::cout << "Selected linear resolution: " << std::fixed << std::setprecision(4)
<< ALPHA*pulleyR/(1<<Engines_uSteppingLevel[RAIL])
<< "m, enter 'y' to confirm, any other key to change selection ";
std::cin >> answer;
if(answer == 'y')
break;
}
}while(true);
即使我输入了正确的值,循环也不会中断。
输入:
std::cout << Engines_uSteppingLevel[RAIL] << ' ' << (RES_LEVELS - 1) << '\n';
代替:
std::cout << '\r';
shell 输出是:
Please enter a valid value for param 'i': 0
0 8
Please enter a valid value for param 'i': 3
3 8
这没有意义。
【问题讨论】:
-
从标准输入读取的原始和熟(行缓冲)读取不能很好地混合。您需要摆脱
_getch()调用,或者摆脱std::cin并仅使用_getch()。 -
不过,我认为您的问题是对
continue关键字跳转到的确切位置的误解。 -
对,它跳转到_getch()结果评估,所以只有在第一轮值正确的情况下,这个东西才能工作。不过,如果输入的第一个值是正确的,则不应达到“继续”
-
你的代码中有很多有问题的东西。一,循环直到你按下
y是这段代码的作用,我不知道为什么这会让你感到惊讶。第二,std::fixed和std::setprecision修饰符没有任何效果,因为您将字符串写入流,而不是数字。那么,RAIL的值是多少,数组有多大呢?如果您访问数组中不存在的元素,程序可能会做一些非常奇怪的事情(“未定义行为”)。 -
也请
std::cout << +Engines_uSteppingLevel[RAIL](或转换为int)。我怀疑您触发了基于字符的 I/O,并且您的变量包含 ASCII 值'0'和'3'而不是数值0和3。
标签: c++