编程中读取输入序列问题总结(持续更新)

本文详细介绍了C++编程中处理不同输入格式的方法,包括利用输入序列的特殊符号分隔和istringstream对象按空格读取。通过实例展示了如何读取字符串、数字序列以及复杂混合序列,并探讨了cin、cin.get()、getline()等函数的使用细节,帮助开发者提升输入处理的效率和准确性。
摘要由CSDN通过智能技术生成

编程题目中经常会遇到给定行数,不定每行数量的读入问题,下面总结常用的读入方法:

 

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()函数调用不会等待用户按键,而直接读取缓冲区中的字符,直到缓冲区中的字符读完后,才重新等待用户按键。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值