使用cin和getline作为字符串

时间:2015-05-18 15:55:29

标签: c++ getline cin

我最近在C++

中遇到了问题
  

如果一系列5位数是连续的,写一个程序来计算出来   数字。为了使这更容易,假设数字是一个字符串:

     

字符串编号=" 10-9-8-7-6&#34 ;;

     

确保您的代码适用于以下序列:

     

字符串编号=" 1-2-3-4-5&#34 ;;

我解决了它,但是当我使用cin作为字符串时,控制台窗口抛出了一些异常&没有执行该程序,但在用getline替换它时,它工作得很好。

任何人都可以向我解释其背后的原因,因为逻辑上两者都应该正常工作。

该计划是:

#include<iostream>
#include<string>

using namespace std;

void change(int x, int y, int &inc, int &dec)
{
    if (x - y == 1)
        ++dec;
    else if (y - x == 1)
        ++inc;
}

int main()

{
    string s = "", snum = "";
    cout << "enter 5 nos and use \'-\' to separate them: ";
    cin >> s;
    int i = 0, x = 0, y = 0, inc = 0, dec = 0;
    for (char &ch : s)
    {
        if (ch == '-')
        {
            ++i;
            if (i == 1)
            {
                y = stoi(snum);
                cout << y << endl;
            }
            else
            {
                x = y;
                y = stoi(snum);
                cout << x << " " << y << endl;
                change(x, y, inc, dec);
            }
            snum = "";
        }
        else
            snum += ch;
    }
    x = y;
    y = stoi(snum);
    cout << x << " " << y << endl;
    change(x, y, inc, dec);
    if (inc == 4 || dec == 4)
        cout << "ORDERED";
    else
        cout << "UNORDERED";
    return 0;

}

2 个答案:

答案 0 :(得分:0)

如果您必须同时输入所有内容,例如:

  

10 9 8 7 6

所有在一行上,cin不会同时记录所有内容。 关于cin,它只占用空格(“”)之前的字符。然而,Getline占用整行并使用它。另一种做同样事情的方法是使用cstdio library并设置使用printfputs进行提示,然后使用gets收集所有内容来自puts提示的信息。这就是我假设它为什么有用的原因。

示例:

cstdio library

char string[50];
printf("Enter a string of text");
gets(string);
cout << string << endl;

*编辑

在下面的评论之后,我意识到你在问什么,如果你假设数字是字符串,并且它们用连字符分隔,没有空格那么它应该可以正常工作。它不应该是cin的问题,也许不是别的吗?

如果您的代码中涉及空格,那么我在EDIT上面写的内容将是解决该问题的简单方法。

答案 1 :(得分:0)

如果您需要获取格式化字符串,我建议您scanf这样:

if( 5 == scanf("%d-%d-%d-%d-%d", &a, &b, &c, &d, &e) )
      //welldone
      // work with above 5 int easily :)
else
      // Please enter again 

这样你根本不必使用字符串,生活会更容易。 您可以轻松检查这5个是否连续。

如果您不需要新的解决方案并希望修复代码,请在评论中告诉我。