还是总结下,不然又忘了,尤其是编程方面的东西,三日不接触就忘了金光。
1.以前一直处理不好输入,只会最简单的cin,但是的确cin解决了很多问题,但是当遇到空格是,就没法处理了。详细的参考这个博客http://www.cnblogs.com/A-Song/archive/2012/01/29/2331204.html
如果要处理一个字符串,而且是每一行中有好几个字符串的问题,常常应付不过。所以现在介绍一个厉害的东西
istringstream, ostringstream, stringstream.分别对应输入,输出,输入输出。都在sstream库中。
具体如何使用,请看这里。
#include <iostream>
#include <string>
#include <sstream>
using namespace std;
int main()
{
string str, line;//初始化string,充分利用c++处理string字符的优势
while(getline(cin, line)) //getline函数待会介绍
{
istringstream stream(line);//stream这个相当于声明了一个isstringstream对象
while(stream >> str)//isstringstream 对象可以自如的转换各种数据类型,而且以空格为分隔符将字符串分解出来。
cout << str << endl;
}
return 0;
}
stringstream转换对象的用例(转自http://blog.163.com/zhuandi_h/blog/static/180270288201291710222975/)
例子一:基本数据类型转换例子 int转string
#
include <string>
# include <sstream>
# include <iostream>
int main()
{
std::stringstream stream;
std:: string result;
int i = 1000;
stream << i; // 将int输入流
stream >> result; // 从stream中抽取前面插入的int值
std::cout << result << std::endl; // print the string "1000"
}
# include <sstream>
# include <iostream>
int main()
{
std::stringstream stream;
std:: string result;
int i = 1000;
stream << i; // 将int输入流
stream >> result; // 从stream中抽取前面插入的int值
std::cout << result << std::endl; // print the string "1000"
}
例子二
例子二:除了基本类型的转换,也支持char *的转换。
#
include <sstream>
# include <iostream>
int main()
{
std::stringstream stream;
char result[8] ;
stream << 8888; // 向stream中插入8888
stream >> result; // 抽取stream中的值到result
std::cout << result << std::endl; // 屏幕显示 "8888"
}
# include <iostream>
int main()
{
std::stringstream stream;
char result[8] ;
stream << 8888; // 向stream中插入8888
stream >> result; // 抽取stream中的值到result
std::cout << result << std::endl; // 屏幕显示 "8888"
}
例子三:再进行多次转换的时候,必须调用stringstream的成员函数clear().
#
include <sstream>
# include <iostream>
int main()
{
std::stringstream stream;
int first, second;
stream<< "456"; // 插入字符串
stream >> first; // 转换成int
std::cout << first << std::endl;
stream.clear(); // 在进行多次转换前,必须清除stream
stream << true; // 插入bool值
stream >> second; // 提取出int
std::cout << second << std::endl;
}
# include <iostream>
int main()
{
std::stringstream stream;
int first, second;
stream<< "456"; // 插入字符串
stream >> first; // 转换成int
std::cout << first << std::endl;
stream.clear(); // 在进行多次转换前,必须清除stream
stream << true; // 插入bool值
stream >> second; // 提取出int
std::cout << second << std::endl;
}
这里还涉及到另一个函数getline()
getline函数。转自http://blog.csdn.net/yelbosh//article/details/7483521
C++中有两个getline函数,一个是在string头文件中,定义的是一个全局的函数,函数声明是istream& getline ( istream& is, string& str, char delim )与istream& getline ( istream& is, string& str );另一个则是istream的成员函数,函数声明是istream& getline (char* s, streamsize n )与istream& getline (char* s, streamsize n, char delim );注意第二个getline是将读取的字符串存储在char数组中而不可以将该参数声明为string类型。
而百度百科上面只有第二种情况,没有第一种。很蛋疼。
在这里,注意下,getline的参数是istream,但是在上面istringstream中,getline(cin),cin是iostream中的,但是也是继承与istream,所以这里也有派生类的应用哦。