尝试验证C ++中的输入

时间:2019-04-26 20:48:48

标签: c++ validation while-loop

在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;
}

2 个答案:

答案 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;

Online demo

如果您希望解析更准确,请考虑以下内容:

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; 
}

逻辑基本上是:

  • 将初始总和设置为0
  • 检查是否有要阅读的东西
    • 如果有,请尝试读取一个值
    • 如果成功,请检查值是否为0
      • 如果为0,则退出并返回总和
      • 否则,将值添加到总和
    • 否则,请清除故障位(以便您可以再次读入东西),并将错误值读入字符串(将被忽略)
  • 否则,返回值