在c ++中,此代码的思想是计算所有输入数字的总和。当用户输入0时,程序应停止。这部分代码可以按我的预期工作,但是我想提供一个变体,该变体可以识别出输入的字符不同于浮点数,在计算中将其忽略,并允许用户继续输入浮点数。目前,输入除浮点数之外的其他任何内容都会停止程序。
我知道有一个“ if(!(cin >> numb))”条件,我尝试在代码中的不同位置对其进行解析,但是我不知道如何强制程序忽略这些无效内容。输入。我将非常感谢您的帮助。
#include <iostream>
#include <stdlib.h>
using namespace std;
float numb; float sum=0;
int main()
{
cout << "This app calculates the sum of all entered numbers." << endl;
cout << "To stop the program, enter 0." << endl << endl;
cout << "Enter the first number: ";
cin >> numb;
while(true)
{
sum += numb;
if (numb!=0)
{
cout << "Sum equals: " << sum << endl << endl;
cout << "Enter another number: ";
cin >> numb;
}
else
{
cout << "Sum equals: " << sum << endl << endl;
cout << "Entered 0." << endl;
cout << "Press Enter to terminate the app." << endl;
exit(0);
}
}
return 0;
}
答案 0 :(得分:1)
您有三个选择:
stringstream
转换字符串,并在出现错误的情况下忽略整个字符串。问题是,如果输入以有效的浮点数开头但包含无效字符(例如12X4),则无效部分将被忽略(例如X4)std::stof()
转换字符串,并检查字符串的所有字符是否都可以成功读取这里是第二种方法,它具有稍微重组的循环,因此0条目将导致退出循环而不是整个程序:
string input;
while(cin >> input)
{
stringstream sst(input);
if (sst>>numb) {
sum += numb;
cout << "Sum equals: " << sum << endl << endl;
if (numb==0)
{
cout << "Entered 0." << endl;
break; // exits the while loop
}
cout << "Enter another number: ";
}
else
{
cout << "Ignored entry "<<input<<endl;
}
}
cout << "Press Enter to terminate the app." << endl;
如果您希望解析更准确,请考虑以下内容:
size_t pos=0;
float xx = stof(input, &pos );
if (pos!=input.size()) {
cout << "error: invalid trailing characters" <<endl;
}
答案 1 :(得分:0)
读取失败后,必须清除故障位。之后,您可以将无效的内容读入字符串(您可以忽略)。此函数将读取值并将其加起来,直到遇到0
或输入流的末尾。
int calc_sum_from_input(std::istream& stream) {
int sum = 0;
// If it couldn't read a value, we just read the thing into here
std::string _ignored;
while(stream) // Checks if the stream has more stuff to read
{
int value;
if(stream >> value)
{
if(value == 0) // Exit if it read the value 0
break;
else
sum += value; // Otherwise update the sum
}
else {
// Clear the failbit
stream.clear();
// Read ignored thing
stream >> _ignored;
}
}
return sum;
}
逻辑基本上是: