如何在C ++中读取用户的多行?

时间:2014-02-05 16:06:52

标签: c++ algorithm input acm

所以我正在进行acm编程练习问题而且我总是停留在从用户那里获取输入。我正在使用C ++。所以我需要读取用户的输入,它可能是多行或我们不知道的单行。因此,如果输入如下:

2

1 2 3 4 5

2 2 2

第一行代表用户玩的游戏数量,后面的行数是分数。每场比赛结束将以换行线结束。我需要阅读这些行并将其存储在某个地方。我该怎么做呢?我看过网站,似乎大多数人都使用scanf或cin或getline,但我不知道那些是什么。

另一个例子:

12 21

13 43

1 4

A C

0 0

每一行都包含我需要添加的两个数字,用空格分隔。当我看到两个零时,输入完成。我如何阅读这些并检查它是否为0 0? 我试过像:

string num1;
while (true) {
    getline(cin,num1);
    if (num1.empty()) {
        break;
    }
}

但它没有用。请帮助我想我知道如何解决问题,但我无法从用户那里获得输入。感谢

3 个答案:

答案 0 :(得分:0)

嗯,我从在线挑战中学到了这一点,这是我在必要时这样做的方式。

第一种情况,我认为你必须申报N个案件,所以我有:

int N;

然后,我们需要在每种情况下使用多个数字,让我们说3.所以我会这样做:

int score1[N];
int score2[N];
int score3[N];

最后,当你必须接受输入时,你会这样做:

cin >> N;

for(int i = 0; i < N; i++)
    cin >> score1[i] >> score2[i] >> score3[i];

我不确定这是否是最好的方法,但这就是我在进行在线挑战时的表现。祝你好运!

答案 1 :(得分:0)

这有点粗糙和笨重,但它应该给你一些工作:

#include <vector>
#include <string>
#include <sstream>
#include <iostream>
#include <stdio.h>
#include <stdlib.h>

using namespace std;

int main() {
    std::cout << "Enter two numbers (0 0 to exit): ";

    string num1;
    while (true) {
        getline(cin, num1);

        string buf;
        stringstream ss(num1);
        vector<string> tokens; // Create vector to hold the two numbers (separately)

        // Split the two numbers (by the spaces)
        while (ss >> buf)
            tokens.push_back(buf);

        cout << "Adding " + tokens[0] << " and " << tokens[1] << endl;

        int sum = atoi(tokens[0].c_str()) + atoi(tokens[1].c_str());

        cout << 0 + sum;

        if (num1.empty()) {

            break;
    }
}

}

答案 2 :(得分:0)

另一个例子:

12 21
13 43
1 4
A C
0 0

为此,您可以执行以下操作:

int a, b;
while(cin >> a >> b , !(a == 0 && b == 0)){
    cout << a+b;
    // any logic for input
}

并为此输入:

2
1 2 3 4 5
2 2 2

使用c++可能会有些麻烦

vector<vector<int> > data;
int n;  cin >> n;
for(int i = 0; i < n; ++i)
    data.push_back(read_vector_line());

这里的棘手功能是read_vector_line。就像这样:

vector<int> read_vector_line()
{
    vector<int> ans;
    string s;
    getline(cin, s);
    // the below line is necessary sometimes for online judges
    // getchar();
    int num = 0;
    for(int i = 0; i < s.size(); ++i)
    {
        char c = s[i];
        if(c == ' ')
        {
            ans.push_back(num);
            num = 0;
        }
        else
        {
            num = num*10 + (c-'0');
        }
    }
    return ans;
}

我不确定这段代码是否正确编译。我离开您的主意是因为我没有任何C ++编译器