我需要制作一个连续读取n
个数字的程序。例如,用户首先输入2个数字的列表,如下所示:
P n
我设法阅读scanf
的内容,但现在我需要阅读n
以下数字,这些数字按如下方式排列。
1 6 3 99 ... n times
这些数字必须一次性阅读(或给人留下印象)。
我已经尝试过使用
了while(getline(cin,str)){
// do something with str
}
正如this thread中所解释的那样,但是当我按下简介键时,我需要在while循环中停止操作。使用我当前的实现,它们不会停止,它只是等待更多行读取。
总结:
首先,用户必须能够输入两个数字(P
和n
)(完成!)然后按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;
}
答案 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()
,然后尝试解析每一行。使用stringstream
或sscanf()
,因为您似乎熟悉它,都是有效的选项。但是,如果您只想阅读输入而不是真正的互动,David Weston的建议也是一个很好的建议,也可能是最简单的建议。但是,由于您使用的是C ++,我建议您改用cin >> variable
。