编程题目中经常会遇到给定行数,不定每行数量的读入问题,下面总结常用的读入方法:
1、利用输入序列的特殊符号分隔
(1)纯字符串 序列 如:qxABzCgRQ
int main() {
int n; cin >> n;//读入后面输入的总行数;
char chh; cin.get(chh);//去掉输入n的时候带入的换行符;(容易忽略!!!)
while (n--) {
//实现代码(略)
while (ch != '\n') {
//对读入的字符ch的处理的实现代码(略)
cin.get(ch);//注意cin识别不出换行符,所以使用换行符作为一行读取输入结束判断标志的时候不能使用cin
}
}
}
(2)输入具有一定规律的数字序列 如:37 24 42 32 7 40 2 42 120
int main() {
int n; cin >> n;
char chh; cin.get(chh);//同理
while (n--) {
//处理代码(略)
char ch = '\0';
while (ch != '\n') {
int x; cin >> x;//读入序列中的整数
//处理读入的整数的处理代码;
cin.get(ch);//同理
}
}
}
(3)复杂的数字字符混合序列 如:3.55.210.-*7.+@(’@’为一行输入的结束符号。‘.’为数的结束符号)
char op;
int now=0;
while((op=getchar())!='@'){
if(op>='0'&&op<='9') now*=10,now+=op-'0';//数字的位数不定
else if(op=='.'){
stk[++i]=now;//以.为结束符,读取一个完整的数字
now=0;
}
}
2、利用istringstream对象按照空格读取
istringstream类可以用作string与各种类型的转换途径
在istringstream类中,构造字符串流时,空格会成为字符串参数的内部分界;
其构造函数原形如下:
istringstream::istringstream(string str);
注意, istringstream 这个类包含在库 < sstream > 中,所以头文件必须包含这个库。
#include <iostream>
#include <stdio.h>
#include<string.h>
#include<string>
#include<sstream>
using namespace std;
int main()
{
string str="I am a girl.";
istringstream is(str);
string buf;
while(is>>buf)
{
cout<<buf<<endl;
}
return 0;
}
运行结果如下,可以看出istringstream是以空格为分隔符进行处理的。
变式:非空格进行分割:先进行转换
#include <iostream>
#include <sstream>
#include <string>
using namespace std;
int main(){
string s = "ab,cd,e,fg,h";
int n = s.size();
for (int i = 0; i < n; ++i){
if (s[i] == ','){
s[i] = ' ';
}
}
istringstream out(s);
string str;
while (out >> str){
cout << str <<' ';
}
cout << endl;
}
关于常见输入方式总结:
1、cin>>函数:cin函数遇到空格、TAB、换行时读取结束,所以无法识别空格和换行等符号;
2、cin.get()函数 注意只能用于读取字符类型
原型:该函数有三种形式,分别是char ch = cin.get(), cin.get(char ch), cin.get(array,length)
(1)cin.get() 和 cin.get(char ch)的用法
这两个函数功能基本一样,都是读取缓冲区的一个字符,遇到换行符结束,但是这两个函数都不会丢弃缓冲区里边的空格和换行符。char ch = cin.get(), cin.get(char ch)这两句可得到相同的结果。
用例:
#include <iostream>
using namespace std;
void main()
{
char ch1,ch2;
cin.get(ch1);
ch2 = cin.get();
cout<<ch1<<endl;
cout<<ch2<<endl;
}
输入:a换行
输出:a
(此处有一行空行,因为不会丢弃缓冲区里边的空行)
(2)cin.get(array,length)
这个函数是从缓冲区读取字符串,其中array是字符串接受地址,length-1是字符串长度,因为最后一个字符必须存 储'\0'结束符,所以此函数只能接受length-1个字符。
用例:
#include <iostream>
using namespace std;
void main()
{
char ch[5];
cin.get(ch,5);
cou<<ch<<endl;
}
输入:abcdefghi
输出:abcd
3、cin.getline(string str,int length)函数
说明:接收一个长度为length-1的字符串,包括空格,遇到换行结束。(同2.(2))
4、getline()函数
原型:getline(cin,string s,char ch='\n');(在C++中)
应包含头文件<string>,读取字符串包含空格,默认遇到换行结束(可以自定义结束符号),不包括换行
说明:getline不是C语言的库函数,而是GCC的扩展定义或者C++库函数,在C语言中和C++中的使用是不同的.
1. istream& getline ( istream &is , string &str , char delim );
2. istream& getline ( istream &is , string &str )
is 进行读入操作的输入流
str 用来存储读入的内容
delim 终结符,遇到该字符停止读取操作,不写的话默认为回车
5、getchar()函数
原型:int getchar(void);
返回值:读取成功返回用户输入的ASCII码,读取失败返回EOF.
头文件:<string>或者<stdio.h>
说明:接收一个字符的输入,包含空格,遇到换行符结束。
#include<iostream>
#include<string>
using namespace std;
int main()
{
char ch;
ch = getchar();
cout<<ch<<endl;
return 0;
}
输入:abc回车
输出:a
另外:从输入输出流的底层角度理解getchar()函数
当程序调用getchar()函数时,程序就等着用户按键,用户输入的字符被存放在键盘缓冲区中,直到用户按回车为止(回车字符也放在缓冲区中)。当用户键入回车之后,getchar()函数才开始从键盘缓冲区中每次读入一个字符。也就是说,后续的getchar()函数调用不会等待用户按键,而直接读取缓冲区中的字符,直到缓冲区中的字符读完后,才重新等待用户按键。