C++ 在尝试打破while循环时陷入无限循环
因此,我正在制作一个带有主菜单的计算器,我希望操作继续,直到用户按下$,然后返回主菜单。当我测试它时,它将我的代码抛出到一个无限循环中。我做错了什么?下面是一个函数的片段。(菜单被声明为无效)C++ 在尝试打破while循环时陷入无限循环,c++,function,loops,C++,Function,Loops,因此,我正在制作一个带有主菜单的计算器,我希望操作继续,直到用户按下$,然后返回主菜单。当我测试它时,它将我的代码抛出到一个无限循环中。我做错了什么?下面是一个函数的片段。(菜单被声明为无效) float生成和(float num1,float num2){ 浮点数r=0; 布尔结束=假; 做{ coutnum1; 如果(num1='$'){ 结束=真; } coutnum2; 如果(num2='$'){ 结束=真; r=num1+num2; cout这肯定行不通。当你说: float num2
float生成和(float num1,float num2){
浮点数r=0;
布尔结束=假;
做{
coutnum1;
如果(num1='$'){
结束=真;
}
coutnum2;
如果(num2='$'){
结束=真;
r=num1+num2;
cout这肯定行不通。当你说:
float num2;
后来:
cin >> num2;
然后只从输入流中读取浮点数。一种解决方法是在循环中:
string input;
...
cin >> input;
if (input == "$") break;
istringstream s(input);
float num;
s >> num; // now you read a float from the string
另一件事是,正如我在上面的代码片段中所示,使用break
打破循环更容易,而不是使用布尔标志并检查它。这肯定行不通。当你说:
float num2;
后来:
cin >> num2;
然后只从输入流中读取浮点数。一种解决方法是在循环中:
string input;
...
cin >> input;
if (input == "$") break;
istringstream s(input);
float num;
s >> num; // now you read a float from the string
另一件事是,正如我在上面的代码片段中所示,使用break
打破循环更容易,而不是使用布尔标志并检查它。您显示的函数不应该构建,它缺少一个右括号}
。在什么情况下,您希望从用户读取的float
类型的值测试为等于'$'
?如果用户输入$
,这当然不是问题,因为流式处理操作员不知道如何将其转换为浮点值。如果您的实现使用ASCII字符集(或与之兼容的函数),输入值36
将导致循环结束,因为36
是'$'
的整数值。您显示的函数不应生成,它缺少一个右括号}
。在什么情况下,您希望从用户读取的float
类型的值测试为等于'$'
?如果用户输入$
,这当然不是问题,因为流式处理操作员不知道如何将其转换为浮点值。如果您的实现使用ASCII字符集(或与之兼容的值),输入值36
将导致循环结束,因为36
是'$'
的整数值。此外,您应该始终测试cin的状态,因为如果它失败,您将有您不想要的输入,因此您的检查将失败(大部分时间).float num=std::stof(输入)
比使用istringstream更容易阅读。@kevr还有很多需要改进的地方,我试图回答这个问题。这里有大量关于Stackoverflow和其他地方的代码示例。该函数可以很容易地用于错误检查。是的,您仍然应该针对“$”
首先。是的,这是正确的。这就是为什么检查“$”
仍然应该首先进行的原因。此外,您应该始终测试cin的状态,因为如果它失败,您将有您不想要的输入,因此您的检查将失败(大多数情况下)。float num=std::stof(输入)
比使用istringstream更容易阅读。@kevr还有很多需要改进的地方,我试图回答目前的问题。这里有大量关于Stackoverflow和其他地方的代码示例。该函数可以非常容易地用于错误检查。是的,您仍然应该针对进行明确的检查。”$“
首先。是的,这是正确的。这就是为什么仍应首先检查“$”
。