istringstream过滤首尾的空字符

本文以leetcode上的一道简单算法题(http://oj.leetcode.com/problems/reverse-words-in-a-string/)来说明istringstream在初始化时会过滤掉首尾的空格。

题目大意是将一个string类型的字符串,按逐个单词倒置。string的首尾可能有零个或多个空格,每个单词之间由一个或多个空格分隔。例如:

Given s = " the sky is  blue  ",
return "blue is sky the".

输入有可能出现空串:“”,或只包含若干个空格的串:“    ”。

此题如果用C写比较麻烦,用C++的vector<string>和istringstream处理则方便许多。AC的代码如下:

#include<iostream>
#include<string>
#include<vector>
#include<sstream>
using namespace std;
class Solution {
public:
    void reverseWords(string &s) {
    	vector<string> svec;
    	istringstream iss(s);
		string str;
		while(iss>>str)
			svec.push_back(str);
		s.clear();
		vector<string>::reverse_iterator rit;
		if(!svec.empty()) {
			for(rit=svec.rbegin();rit!=svec.rend()-1;++rit){
				s.append(*rit).append(" ");
			}  
			s.append(*rit);
		}
		cout<<s<<"hhhaha"<<endl;
    }
};
可以验证,如果s=“    abc  def   ghi     ”,istringstream对象iss接收s后会过滤首尾的空格,

需要注意的是,如果s=“”或s=“      ”,则iss为空,svec也为空。


关于istringstream常见的用法还有另一种情况值得注意,就是从外部文件中按行读取数据:

void read_data ( const string &filename ) {
	ifstream infile;   //文件输入流 
	string line,str;   
	istringstream iss;  //string输入流 
	infile.open( filename  );

	while( getline( infile,line ) ){ //getline按行读取文件数据 ,line的末尾会保存一个换行符 
		iss.clear();
		iss( line );    //ss的末尾也会随之保存一个换行符      
		while( ss >> str ) {
			/*具体代码省略*/ 
			/* 注意ss最后会给str一个换行符,如果不希望保留这个换行符,应做相应的删除处理 */	
		}
		
	}
	infile.close();	
}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值