在控制台中读取一行直到换行
Reading a row until newline in the console
我需要编写一个程序来连续读取 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
)(完成!)然后按回车键并开始输入 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;
}
在 n 次循环中使用 scanf()
而不是 getline()。
for(int i = 0; i < n; i ++){
scanf("%d",&variable);
}
不确定我是否理解您的问题,但此代码将读取 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
这道题几乎是经典。经典题有这段代码:
cin >> n;
getline(cin, s);
然后作者很疑惑为什么s
是空的。您的变体也是如此,尽管它也使用 C stdio 函数使事情变得更加混乱。问题是第一个调用是基于字段的输入,它将读取单个值 n
并将任何其他输入留在缓冲区中!如果用户输入 42 并按下回车键,剩下的输入就是换行符。第二个 getline()
调用然后读取一个空字符串并丢弃换行符。
为了与用户交互,只使用getline()
然后尝试解析每一行。使用 stringstream
s 或 sscanf()
,因为您似乎很熟悉它,这都是有效的选择。但是,如果您只想阅读输入而不是真正互动,David Weston 的建议也是一个很好的建议,而且可能也是最简单的建议。但是,由于您使用的是 C++,我建议改用 cin >> variable
。
我需要编写一个程序来连续读取 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
)(完成!)然后按回车键并开始输入 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;
}
在 n 次循环中使用 scanf()
而不是 getline()。
for(int i = 0; i < n; i ++){
scanf("%d",&variable);
}
不确定我是否理解您的问题,但此代码将读取 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
这道题几乎是经典。经典题有这段代码:
cin >> n;
getline(cin, s);
然后作者很疑惑为什么s
是空的。您的变体也是如此,尽管它也使用 C stdio 函数使事情变得更加混乱。问题是第一个调用是基于字段的输入,它将读取单个值 n
并将任何其他输入留在缓冲区中!如果用户输入 42 并按下回车键,剩下的输入就是换行符。第二个 getline()
调用然后读取一个空字符串并丢弃换行符。
为了与用户交互,只使用getline()
然后尝试解析每一行。使用 stringstream
s 或 sscanf()
,因为您似乎很熟悉它,这都是有效的选择。但是,如果您只想阅读输入而不是真正互动,David Weston 的建议也是一个很好的建议,而且可能也是最简单的建议。但是,由于您使用的是 C++,我建议改用 cin >> variable
。