cin如何检测eol与无效字符

时间:2016-06-19 21:08:34

标签: c++

问题:

编写一个程序来计算整数的加法并打印输出。

输入格式:

第1行:由空格分隔的整数

输出:

输出由一个整数组成,对应于加法,后跟一个新行。 第1行添加数字

示例输入和输出:

输入1:

3 4 5 6 7

输出1:

25

输入2:

3 5 a b 7

输出:

输入无效

所以,我尝试了很多方法,但似乎没有任何工作

这是我放弃之前的最后一次尝试

#include <iostream>

using namespace std;
int main(){

    int i;
    int sum=0;

     cin>>i;
      while(isdigit(i)){

        sum+=i;
       cin>>i;
      }
      if(!isdigit(i)) cout<<"Invalid Input";
      else cout<<sum;


  return 0;

非常感谢所有帮助过的人......

我意识到我正在以错误的方式使用isdigit ... 代码略有修改就是诀窍

最终解决方案

#include <iostream>

using namespace std;
int main(){

    char i;
    int sum=0;


      while(cin>>i){

       if(!isdigit(i)) {
                cout<<"Invalid Input";
                return 0;
       }
        sum+=(i-'0');

      }
         cout<<sum;


  return 0;
}

*让我解释一下我最终做了什么....我把所有输入都作为char 我让(cin&gt;&gt; i)确保读取输入直到EOL。

我添加了一个条件来检查我得到的输入是不是一个数字(如果发生这种情况,我会打印“无效输入”并打破循环..这样我会得到相当于char的int值('0'- i),将其添加到求和并继续循环直到循环结束并打印总和*

如果存在两位数字的另一种解决方案(仅适用于c ++ 11以后)

#include <iostream>

using namespace std;
int main(){

    string i;
    int sum=0;


      while(cin>>i){
       try{

          sum+= stoi(i);

       } 
       catch(...){

           cout<<"Undefined";
           return 0;
       }

      }
         cout<<sum;


  return 0;
}

3 个答案:

答案 0 :(得分:0)

嗯,声明

 cin>>i;

从标准输入流中读取一个数字。

的输入
 3

得到整数值3

isdigit(i)函数会检查i是否为['0'-'9']范围内的字符值,小数为[48-57]

要检查无效输入,您宁愿写

  while(cin >> i) {
    sum+=i;
  }

答案 1 :(得分:0)

尝试这样的事情:

#include <iostream>
using namespace std;
int main(){

    // Get the full line of input
    string line;
    getline(cin, line);

    // Variables used to loop through your input
    bool failed = false;
    int sum = 0;
    int place = 1;

    // Start from the back keeping track of current place values
    for (int i = line.length() - 1; i >= 0; i--) {

        if (isdigit( line[i] )) {
            // For digits we add the 
            sum +=  place * ((int) line[i] - 48); // Subtract 48 (It gives ASCII)
            place *= 10; // Prepare for next digit
        }
        else if (line[i] == ' ') {
            // Our delimiter
            place = 1; // Prepare for next number
        }
        else {
            // Not a space our a digit
            cout << "invalid Input";
            failed = true;
            break;
        }
    } 
    if (!failed){
        cout << sum;
    }
    return 0;
}

我们使用cin而不是直的getline来将整行作为字符串的输入,向后遍历,并在我们的总和中添加数字。

关于标题中的问题

在您的版本中,您遇到了一些问题,但最大的问题是您使用整数运行isdigit,并且您获得的结果无效。如果你想检查cin到int和int的转换是否正常工作,你应该使用cin的内置failbit。

例如:

int i;
cin >> i;

输入:

hello

将激活cin中的failbit。您可以使用cin作为bool来检查它。

以下代码:

int i;
cin >> i;
while (cin){
    cin >> i;
}

将继续将整数放入i中,直到它获得无效的int,如“hello”。

然而,这不会捕获一行的结尾,或者如果用户只按空格键而没有输入,那么它对于跟踪输入结束的位置没有用,因为cin忽略一个空输入,并将继续等待。这就是我为此推荐getline的原因。

答案 2 :(得分:0)

读取一个完整的行,然后逐个元素地解析它。阅读该行:

std::string line;
std::getline(cin, line);

要解析它,请创建一个std::istringstream并从中读取:

std::istringstream in(line);
int val;
while (in >> val) {
    // whatever
}

当循环退出时,请检查为什么退出:

if (in.eof())
    // got through the full line, hit end of file
else
    // stopped short, because something was wrong with the input