前言

c++中的string类提供了许多函数给我们使用,也重载了一些基本的运算符,例如string类中的append()函数和重载的’+’运算符可以让我们将字符串与字符串或字符进行拼接,但是却没有直接提供将字符串与其他基本类型数据拼接的函数或运算符,当我们需要将字符串与其他基本类型拼接时该怎么办呢?

实现

c++中将字符串与其他基本类型数据拼接十分的灵活,灵活之处在于有很多种方式可以实现拼接,下面我就介绍几种将字符串与其他基本类型拼接的方法.讲的一些方法中游的部分是没有涉及到c++中的string而是c中的字符串(字符数组),若是只想看string的可以跳过一些方法.

sprintf函数

函数原型:int sprintf (char *__stream, const char *__format, ...);

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include<iostream>
#include<cstring>
using namespace std;
int main(){
char *s = "aaa";
int a = 1;
double b = 1.11;
char *buf = new char();
sprintf(buf, "%s%d%.2f", s, a, b);
cout << buf << endl;
system("pause");
}
//输出:
//aaa11.11
//请按任意键继续. . .

此方法局限性较大,用这种方式拼接类似于c中的字符操作函数char *strcat(char *dest,char *src)只不过用sprintf可以将字符串与其他基本类型的数据进行拼接,美中不足的是需要注意拼接时有浮点型的数据要控制小数点的位数,并且与strcat()一样的,拼接的字符串和拼接后的字符串是c风格的字符串.c风格字符串和c++string字符串的不同和转换可以看下这篇文章:C++ string对象和C风格字符串的差别与转换接口

itoa函数

函数原型:char *_itoa(int value, char *string, int radix);

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include<iostream>
#include<cstring>
using namespace std;
int main() {
char* s = "a";
int a = 1;
char *buf=new char();
_itoa(a, buf, 10);
cout << s+buf << endl;
system("pause");
}
//输出:
//a1
//请按任意键继续. . .

此方法局限性相比sprintf()更大,因为只能将string字符串与整型数据拼接并且使用的是非标准C语言和C++语言扩展函数,注意函数原型中的radix参数是转换时的基数,具体的可以见:itoa-百度百科

to_string函数

函数原型:

1
2
3
4
5
6
7
8
9
string to_string (int val);
string to_string (long val);
string to_string (long long val);
string to_string (unsigned val);
string to_string (unsigned long val);
string to_string (unsigned long long val);
string to_string (float val);
string to_string (double val);
string to_string (long double val);
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
#include <string>
using namespace std;
int main() {
string s = "a";
int a = 1;
double b = 1.11;
cout << s+to_string(a)+to_string(b) << endl;
system("pause");
}
//输出:
//a11.110000
//请按任意键继续. . .

此方法适用于string字符串与其他基础类型拼接,需要注意的是to_string()函数是c++11中引入的标准库函数,使用该函数拼接唯一不足的一点就是拼接的是浮点型数据时小数点后会跟6位,不足6位0来补,有时候可能达不到我们想要的结果.

重载运算符

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <iostream>
#include <sstream>
#include <string>
using namespace std;
template <typename T>
string operator&(const T &t, const string &s) {
ostringstream oss;
oss << t;
return oss.str() + s;
}
template <typename T>
string operator&(const string &s, const T &t) {
ostringstream oss;
oss << t;
return s + oss.str();
}
int main() {
string s = "a";
int a = 1;
double b = 1.11;
cout << (s & a & b) << endl;
system("pause");
}
//输出
//a11.11
//请按任意键继续. . .

重载&运算符使得string字符串可以与其他任意基本类型进行拼接,对于浮点型数据也不会在小数点后跟上0,可以说是十分完美的一种方法了.

后记

对于string字符串拼接,除了上面讲的一些方法还有很多方法,例如利用string类中substr()函数还可以实现将字符串的某一片段与其他字符串或基本类型数据拼接,总之,按不同的需求来拼接,思路不同,方法更是有很多种.