【问题标题】:Use of cin and getline for strings使用 cin 和 getline 处理字符串
【发布时间】:2015-05-18 15:55:29
【问题描述】:

我最近在C++做一个问题:

编写一个程序来计算一系列 5 位数字是否连续 数字。为了让这更容易,假设数字是一个字符串:

字符串数字 = "10-9-8-7-6";

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

字符串数字 = "1-2-3-4-5";

我解决了它,但是我看到当我使用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;

}

【问题讨论】:

  • 如果你给出的是失败的代码而不是工作代码,那会更容易回答。
  • 我运行您的代码并没有遇到任何问题。你能清楚地解释你的问题吗?
  • 只需将 getline(cin,s) 替换为 cin>>s

标签: c++ getline cin


【解决方案1】:

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

10 9 8 7 6

全部在一行然后cin 不会同时记录所有这些。 例如,关于cin,它只需要空格(“”)之前的字符。 Getline 但是会占用整行并使用它。另一种方法是使用cstdio library 并使用printfputs 进行提示,然后使用gets 从 puts 提示中收集所有信息。这就是我认为它起作用的原因。

例子:

cstdio 库

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

*编辑

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

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

【讨论】:

  • 先生,您当时没有正确获取代码,它说我们正在输入字符串:“1-2-3-4-5”或“10-9-8-7-6”即用连字符分隔数字。我们根本不使用空间,所以 cin 应该可以完美运行
  • 如果它们是字符串,那么它应该在编译器中运行良好。那是因为它不需要任何空格,只有连字符。如果涉及空格,则需要“getline”或“gets”之类的其他内容。
【解决方案2】:

如果你需要得到一个格式化的字符串,我推荐你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 个是否连续。

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

【讨论】:

  • 问题要求我们假设一个字符串先生。否则我 wud hv 肯定默认使用你的方法(但使用 cin)。
猜你喜欢
  • 1970-01-01
  • 2016-06-28
  • 2012-11-13
  • 2018-02-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多