重回C++----字符串分割+数据格式转化

这个系列的博客是我在工作中对于本科学习的C++的复习与反思,工作了才发现之前学的C++真的太浅。

看了别人的代码,不懂得重新熟悉学习发出来

先贴代码

void split(const string& s, vector<double>& sv, const char flag = ' ') {
	sv.clear();
	istringstream iss(s);
	string temp;

	while (getline(iss, temp, flag)) {
		sv.push_back(stoi(temp));
	}
	return;
}

这个代码可以将一个以特定符号分割的字符串如"3 4 6 134 56 -34"将其中的数字取出并以int数组的形式呈现。

其中所使用的

1、向量(Vector)是一个封装了动态大小数组的顺序容器(Sequence Container)。需要使用include<vector>引入

http://www.runoob.com/w3cnote/cpp-vector-container-analysis.html

2、stoi()是将字符串转成int数的方式,对不合规格或超出int范围的数会抛出异常,其包含在std中,另一个函数atoi()作用相同不过不会在超出Int范围时抛出异常,而是返回上下界,它在标准库中。函数原型如下:

int stoi (const string&  str, size_t* idx = 0, int base = 10);

其中:

str:字符串对象,表示整数。
idx:指向size_t类型对象的指针,其值由函数设置为数值后str中下一个字符的位置。此参数也可以是空指针,在这种情况下不使用它。
base:确定有效字符及其解释的数字基数(基数)。
如果为0,则使用的基数由序列中的格式确定(有关详细信息,请参阅strtol)。 请注意,默认情况下,此参数为10,而不是0。

这类常用函数还包括:

(1)stol 将字符串转换为long int

(2)stoul 将字符串转换为无符号整数                 stoll 、stoull

(3)stof 将字符串转换为float

(4)stod  将字符串转换为double                        stold

3、getline的函数原型:

getline(char *sink, streamsize size, char delimiter='\n')
getline( istream &is, string str, char delimiter );

所以这个方法不止可以读取一行,还可以指定作为标志的字符来读取,如上面的例子代码中就是使用的' '空格符

4、 istringstream包含在<sstream>中(<sstream>包含<iostream>所以无需同时包含两者)

1 istringstream 从istream 派生从一个字符串中读取数据
2 ostringstream 从ostream 派生写入到一个字符串中
3 stringstream 从iostream 派生从字符串中读取或者写入到字符串中

这里是将一个字符串作为流来使用,而输出操作符可以接受任何内置数据类型的实参包括const char*,所以如代码:

string str="this is a test";  
    istringstream is(str);  
    string s;  
    while(is>>s)  
    {  
        cout<<s<<endl;  
    }  

的输出将是:

this

is

a

test

而且也可以用这个方法做一个数据类型转换:

int a, b, c;
	string s = "2 34 564";
	istringstream ss(s);
	ss >> a >> b >> c;
	cout << a << " " << b << " " << c << " ";

的输出便是 2 34 564

发布了19 篇原创文章 · 获赞 2 · 访问量 5170

猜你喜欢

转载自blog.csdn.net/gunjiu4462/article/details/89287012