【问题标题】:How to take the following input in C++如何在 C++ 中获取以下输入
【发布时间】:2011-12-19 06:11:21
【问题描述】:

我必须取可变数量的双精度值,然后是一个字符来结束双精度值的输入(被读入 inData 列表)。在此之后,我必须在 i 和 m 中输入 2 个整数。

问题是cin溢出了。

我必须对程序进行以下输入

0.594
0.928
0.515
0.055
0.507
0.351
0.262
0.797
0.788
0.442
0.097
0.798
0.227
0.127
0.474
0.825
0.007
0.182
0.929
0.852
e
2 5

为此,我的代码如下:

#include <iostream>
#include <list>
#include <cstdio>
using namespace std;

int main (void)
{    list <double> inData;
     double temp;
     int i, m, M, N;
     char a;
     while (cin >> temp)
     {    inData.push_back(temp);
     }
     N = inData.size();
     //fflush(cin);
     //cin >> a;
     cin.ignore(1);
     cin >> i >> m;
     cout << (int )a << " " << N << " " << i <<  " ABC " << m << endl;
     return 0;
}

这有什么问题.. 请看看为什么它没有取 i 和 m 的值。 i 和 m 在 cout 行中给出垃圾值...

输出即将到来

-65 20 233304 ABC 213344

其中第 1、第 3 和第 5 个值是垃圾。

【问题讨论】:

    标签: c++ iostream


    【解决方案1】:

    试试这个:

    cin.clear();
    cin >> a;
    

    【讨论】:

    • @Saurajeet -- 请为您认为有用的所有答案投票(单击向上箭头图像)并接受您认为最有用的答案(单击复选标记图像)。跨度>
    【解决方案2】:

    cin &gt;&gt; temp 最终失败时(因为遇到了“e”标记),failbit 将设置在cin 上,这会阻止从流中读取更多数据,直到它是cleared。

    while (cin >> temp) { inData.push_back(temp); }
    N = inData.size();
    cin.clear(); // <---
    cin >> a >> i >> m; // no need to 'ignore' or flush anything
    

    【讨论】:

      【解决方案3】:

      我想你想要的是:

           do{
              cin >> temp;     
              if (cin.good())
                  inData.push_back(temp);
           } while (cin.good());
           cin.clear();
      

      而不是 while 循环。

      a 变量不再从 cin 读取,因此很可能是垃圾。

      【讨论】:

      • 可以简化为while (cin &gt;&gt; temp) inData.push_back(temp); cin.clear();
      • 啊!现在我明白了。我不知道 istream 中的 operator void* 并一直想知道它为什么会起作用。
      【解决方案4】:

      说到线

          N = inData.size(); 
      

      cin 处于无效状态。对 cin 的任何操作都会失败。你应该重置它的状态并使用它。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-11-04
        • 1970-01-01
        • 2011-02-24
        • 1970-01-01
        • 2020-09-17
        • 1970-01-01
        • 2023-03-29
        相关资源
        最近更新 更多