这篇文章大多是总结前辈的经验,让自己可以更好的认识这个问题,在文章背后都有原文链接
1.多行输入数据
一般题中要求输入多组数据的意思就是读取数量不定的输入数据(不能确定输入数据的数量),在这种情况下,需要不断读取数据直至没有新的输入为止。
#include <stdio.h>
int main()
{
int a;
while(scanf("%d",&a)!=EOF)
{
printf("%d\n",a);
}
return 0;
}
上面是使用C语言的的方法,把输入语句作为while循环的判断条件,当输入数据不是文件结束符(EOF)的时候,就可以实现连续输入
没有明确指出输入什么时候结束
如果是这种情况,我们默认是以“文件结束”(EOF)为结束标志。
可以将上述的EOF改为’\n’,里面改为printf(’’%d,a’’),表示为输入不为换行时持续输入,保证一行输入多个不定量数据。
#include <iostream>
using namespace std;
int main()
{
for(int i;cin>>i;)
{
cout << i << endl;
}
return 0;
}
方法二是用C++for循环实现,将输入语句作为for循环的condition部分,而expression部分省略不写,因为条件部分能改变i的值,所以这个循环无需表达式部分,其中,条件部分不断检查输入流的内容,只要读取完所有的输入或者遇到一个输入错误就终止循环
在另一个博主的文章里也总结了如何实现输入不定量数据,链接在文章最后,在这里直接复制粘贴他的总结一下,以便将问题得到更多方法的解决。
C语言
1.知道输入数据组数n
scanf("%d",&n);
whlie(n–){
这里处理每一组输入.然后直接按格式输出,没必要开数组存储答案.
}
2.没有数据总数,以EOF结束
可能用的几个函数:
scanf():
while(scanf("%s|%d")!=EOF){
处理每一组数据,并输出.
}
getchar():读入一个字符
whlie((ch=getchar())!=EOF){
}
gets():读入一行
while(gets(buf)!=NULL) {
}
用getchar,gets注意读入换行符.
3.以0或-1结束的输入.
while(scanf("%d",&n),n!=0) {
}
关于C++的输入输出处理
cin读字符串时遇到空白符(空格,换行等)结束
char str[BUFFER];
while (cin >> str) {
}
getline读字符串时遇到换行符结束,用于读一整行
char str[BUFFER];
while (cin.getline(str, BUFFER)) {
}
string str;
while (getline(cin, str)) {
}
cin/cout要比scanf/printf慢一些,尽可能使用scanf/printf以避免测试大量数据时因为输入输出慢而导致TLE. putchar/getchar要比scanf/printf更快
2.多行输入字符串
包含其他输入后读入多行字符串
例如一些编程题要求先输入字符串行数,然后再一行一行读入字符串。如果正常顺写编程的话,会发现第一行字符串读入的是空,后续才能正常录入每行字符串。
这是因为第一行输入一个int数据后,换行符并没有被忽略,直接被准备读入第一行字符串的getline俘获。
所以需要在第一行输入一个int数据后,调用cin.ignore()忽略下面的一个流录入,将其抛弃。
int N;
cin>>N;
cin.ignore(); //取消换行键的读入
string strCinLine[100];
for(int i =0;i<N;i++)
getline(cin,strCinLine[i]);
或者给strCinLine动态申请空间,节省空间开销。
int N;
cin>>N;
cin.ignore(); //取消换行键的读入
string* strCinLine = new string[N];
for(int i =0;i<N;i++)
getline(cin,strCinLine[i]);
delete []strCinLine; //记得释放动态空间
strCinLine = NULL;
3.EOF妙用
在C语言中,或更精确地说成C标准函数库中表示文件结束符(end of file)。在while循环中以EOF作为文件结束标志,这种以EOF作为文件结束标志的文件,必须是文本文件。在文本文件中,数据都是以字符的ASCII代码值的形式存放。我们知道,ASCII代码值的范围是0~127,不可能出现-1,因此可以用EOF作为文件结束标志。
main()
{
int c;
c=getchar();
while(c!=EOF)
{
putchar(c);
c=getchar();
}
}
当没有输入的时候,getchar会返回一个特殊值,这个值就是EOF。
4.采用总结所用到的文章
ACM 新手入门 之 如何实现多组输入输出
C/C++中输入多组数据方法
C/C++读入多行字符串string
后面的文章也有很好的解决方法,可以一起看看
C++:如何输入多行数字/字符串