string与stringstream

string与stringstream

string

string是c++提供的字符串型,和c的字符串相比,除了有不限长度的优点外,还有其它许多方便的功能。

首先加入#include\ ,声明变量可以写成string s;s=”hello”,也可以直接设置其值string s = “TCGS”,如果要取得其中一个字符,和传统的c语言一样是用s[i]取得。比较不一样的是如果s有三个字符,传统c的字符s[3]是0字元,但是c++的string则是只到s[2]这个字符而已。

操作:

- 声明:
    + string:string s
    + 字符阵列:char s[100]
- 取得第i个字符
    + string:s[i]
    + 字符阵列:s[i]
- 字符串长度
    + string:s.length()
    + 字符阵列:strlen(s)
- 读取一行
    + string:getline(cin, s)
    + 字符阵列:gets(s)
- 设成某字符串
    + string:s="TSS"
    + 字符阵列:strcpy(s, 'TSS')
- 字符串相加
    + string:s = s + 'TSS'
    + 字符阵列:strcat(s, 'TSS')
- 字符比较
    + string:s=='TSS'
    + 字符阵列:strcmp(s, 'TSS')

stringstream

stringstream是c++提供的另一个字符串型的串流物件,要使用stringstream,必须先加入这一行:#include,stringstream主要是用在将一个字符串分割,可以先用clear()以及str()将指定字符串设定成一开始的内容,再用>>把个别的资料输出,例如:

1
2
3
4
5
6
7
string s;
stringstream ss;
int a,b,c;
getline(cin, s);
ss.clear();
ss.str(s);
ss>>a>>b>>c;

题目:输入的第一行有一个数字N代表接下来N行资料,每一行资料里有不固定个数的整数(最多20个,每行最大200个字符),请你写一个算法将每行的总和打印出来
輸入:

3
1 2 3
20 17 23 54 77 60
111 222 333 444 555 666 777 888 999

輸出:

6
251
4995

程序:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
string s;
stringstream ss;
int n, i, sum, a;
cin >> n;
getline(cin, s); // 讀取換行
for (i=0; i<n; i++)
{
getline(cin, s);
ss.clear();
ss.str(s);
sum=0;
while (1)
{
ss >> a;
if ( ss.fail() ) break;
sum+=a;
}
cout << sum << endl;
}

1
2
3
4
5
6
string常用的方法有size(),find(),substr()方法:
string str = "yutyuyuyussdfas";
size_t pos = str.find("ssdf", 3); //用if(pos==string::npos)用来判断是否找到字符串
string str2 = str.substr(pos, 5);
//find函数从str的第三个位置查起,找到sddf这个字符串后,返回字符串的位置。而substr函数从pos位置开始,截取5个字符,赋给str2

stringstream是字符串流,可以用来数据切分或者类型转化。

1
2
3
4
5
6
string i2s (int i, int len = 0){
stringstream ss;
ss << setw(len) << setfill('0') << i;
return ss.str();
}
//以i2s(7, 3)形式调用这个函数,返回的结果是字符串007

string到int的转换

1
2
3
4
string res = "1000";
int n = 0;
stream<<result;
stream>>n;

在类型转化中使用模板。to_string()函数将t转化为字符串并写入result中。使用str()成员函数来获取流内部缓存的一份拷贝:

1
2
3
4
5
6
7
8
9
template <class T>
void to_string(string &result, const T &l){
ostringstream oss; //创建一个流
oss<<t; //把值传递到流中
result = oss.str(); //获取转换后的字符并将其写入result
}
to_string(s1, 10.5); //double到string
to_string(s1, 123); //int到string

可以更进一步定义一个通用的转化模板,用于任意类型之间的转换。函数模板convert()含有两个模板参数out_type和in_type,功能是将in_value值转换成out_type类型:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
template <class out_type, class in_value>
out_type convert (const in_value &t){
stringstream stream;
stream << t; //向流中传值
out_type result; //这里存储转换结果
stream>>result; //向result中写入值
return result;
}
double d;
string salary;
string s = "23.323";
s = convert<double>(s);
salary = convert<string>(9000.0);

在进行多次转换的时候,必须调用stringstream的成员函数clear()函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#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;
}