【问题标题】:Reading a row until newline in the console在控制台中读取一行直到换行
【发布时间】:2015-09-29 04:39:20
【问题描述】:

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

P n

我设法阅读了带有scanf 的那些,但现在我需要阅读n 后面的数字,这些数字连续给出如下。

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

我已经尝试过使用

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

正如this thread 中所解释的那样,但是当我按下 intro 键时,我需要 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;
}

【问题讨论】:

  • 是否需要明确退出阅读模式?
  • 我不明白你在说什么,但我只需要最后打印分数数组。
  • 用户输入 P n 并回车。然后他输入 1 2 3 4 5 并按下回车键。此时,您希望用户能够键入其他数字还是停止阅读?
  • @victor 我要停止阅读
  • 对不起,我正在尝试理解您的问题,但我仍然感到困惑。 while(getline(...)) 将继续尝试读取行,直到您跳出循环。如果您只想读取一行,为什么要使用 while 循环?

标签: c++ getline


【解决方案1】:

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

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

【讨论】:

  • 那不需要我每次都按介绍让循环继续下一次扫描吗?
  • 否,例如:假设 n=5 ,则 1 2 3 4 5(然后按回车,循环停止,最后按单回车)
【解决方案2】:

不确定我是否理解您的问题,但此代码将读取 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

【讨论】:

    【解决方案3】:

    这个问题几乎是经典。经典问题有这样的代码:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-07-05
      • 1970-01-01
      • 2015-11-06
      • 2010-09-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多