读取一行直到控制台中的换行符

时间:2015-09-29 04:39:20

标签: c++ getline

我需要制作一个连续读取n个数字的程序。例如,用户首先输入2个数字的列表,如下所示:

P n

我设法阅读scanf的内容,但现在我需要阅读n以下数字,这些数字按如下方式排列。

1 6 3 99 ... n times 这些数字必须一次性阅读(或给人留下印象)。

我已经尝试过使用

while(getline(cin,str)){
// do something with str
} 

正如this thread中所解释的那样,但是当我按下简介键时,我需要在while循环中停止操作。使用我当前的实现,它们不会停止,它只是等待更多行读取。

总结: 首先,用户必须能够输入两个数字(Pn)(完成!)然后按Enter键并开始键入n个数字列表(未完成!)。

这是我的代码。

#include <iostream>
#include <string>
#include <sstream>

using namespace std;
int main(void){
    int P,n;
    scanf("%d %d",&P,&n);
    string val;
    int score[P];
    int i;
    for(i=0;i<P;i++){
        score[i]=0;
    }
    while(getline(cin,val)){
        printf("Val=%s\n",val.c_str());
        stringstream stream(val);
        int local;
        while(stream >> local){
            score[local]=score[local]+1;
            printf("%d-%d\n",local,score[local]);
        }

    }
    for(i=0;i<P;i++){
        printf("%d-%d\n",i,score[i]);
    }
    return 0;
}

3 个答案:

答案 0 :(得分:1)

在n次循环中使用scanf()而不是getline()。

for(int i = 0; i < n; i ++){
   scanf("%d",&variable);
}

答案 1 :(得分:1)

不确定我理解你的问题,但是这段代码会读取2个数字,然后是一行,然后完成。

using namespace std;

int main(){
    int P,n;

    cin >> P;
    cin >> n;

    int *score = new int[P];

    for(int i=0;i<P;i++){
        score[i]=0;
    }

    int num;

    string val;

    cin.ignore();
    getline(cin, val);

    istringstream stream(val);

    while (stream >> num) {

        printf("Val = %d\n", num);

        score[num]=score[num]+1; // potential segmentation fault here in your code

        printf("%d-%d\n",num,score[num]);
    }

    delete [] score;

    return 0;

}

由于您假设线上的数字小于P(即数组的大小),因此会发生错误。但是,以下输入会导致错误:

1 2 5

答案 2 :(得分:0)

这个问题几乎是一个经典问题。经典问题有这段代码:

cin >> n;
getline(cin, s);

然后作者很困惑为什么s为空。您的变体也是如此,尽管它也使用C stdio函数来使问题更加混乱。问题是第一个调用是基于字段的输入,它将读取单个值n并将任何其他输入留在缓冲区中!如果用户输入42并按Enter键,则剩余输入为换行符。然后第二个getline()调用读取一个空字符串并丢弃换行符。

要与用户进行互动,请仅使用getline(),然后尝试解析每一行。使用stringstreamsscanf(),因为您似乎熟悉它,都是有效的选项。但是,如果您只想阅读输入而不是真正的互动,David Weston的建议也是一个很好的建议,也可能是最简单的建议。但是,由于您使用的是C ++,我建议您改用cin >> variable