字符串字面量(比如 "Hello, ")也可以直接与 std::string 对象使用 + 操作符拼接
#include <iostream>
#include <string>
int main() {
std::string str1 = "Hello";
std::string str2 = ", World!";
std::string str3 = str1 + str2; // str3 是 "Hello, World!"
std::cout << str3 << std::endl; // 输出: Hello, World!
// 使用 operator+ 添加单个字符
std::string exclamation = "!";
std::string str4 = str3 + exclamation; // str4 是 "Hello, World!!"
// 使用 operator+ 添加 C 风格字符串
std::string str5 = str4 + " How are you today?"; // str5 是 "Hello, World!!! How are you today?"
return 0;
}
如果要将新字符串追加到现有的字符串上,可以使用 += 操作符,这种方法会在现有的字符串对象上直接追加内容,而不是创建一个新的字符串对象
#include <iostream>
#include <string>
int main() {
std::string greeting = "Hello, ";
greeting += "World!";
std::cout << greeting << std::endl; // 输出: Hello, World!
return 0;
}
append() 方法,用于将一个字符串追加到另一个字符串的末尾,append() 方法有几个重载,允许指定追加字符串的特定部分或重复多次追加同一字符串。
#include <iostream>
#include <string>
int main() {
std::string greeting = "Hello, ";
greeting.append("World!");
std::cout << greeting << std::endl; // 输出: Hello, World!
return 0;
}
std::string str1 = "Hello";
std::string str2 = ", World!";
str1.insert(str1.size(), str2); // str1 现在是 "Hello, World!"
如果需要连续地拼接很多片段,使用 std::stringstream 可以更方便地构建字符串,std::stringstream 非常灵活,可以方便地将各种数据类型转换成字符串并进行拼接。
#include <iostream>
#include <string>
#include <sstream>
int main() {
std::stringstream ss;
ss << "Hello, ";
ss << "World";
ss << '!';
std::string combined = ss.str();
std::cout << combined << std::endl; // 输出: Hello, World!
return 0;
}
通过连接字符数组的方式来创建新的 std::string 对象
#include <iostream>
#include <string>
int main() {
const char* part1 = "Hello, ";
const char* part2 = "World!";
std::string combined(part1);
combined += part2;
std::cout << combined << std::endl; // 输出: Hello, World!
return 0;
}
push_back 方法是向字符串的末尾添加单个字符的简便方式,
每次调用 push_back 都会附加一个新的字符到 std::string 的末尾。
如果你需要将单个字符附加到现有字符串中,你可以使用这个方法。请注意,push_back 仅适用于添加单个字符,而不适用于整个字符串。
使用 push_back 的好处是它可以直接向字符串内部的字符缓冲区添加数据,这样可以避免不必要的内存分配操作。在需要逐个字符构建字符串的情况下,这个方法是非常高效的。
然而,如果你需要添加更多的字符或者另一个字符串,使用 += 运算符或 append 方法会更加方便。
std::string str = "Hello";
str.push_back(','); // 添加一个逗号
str.push_back(' '); // 添加一个空格
str.push_back('W'); // 接着添加字符 'W'
str.push_back('o');
str.push_back('r');
str.push_back('l');
str.push_back('d');
str.push_back('!'); // str 现在是 "Hello, World!"
strcat()函数原型
char *strcat(char *dest, const char *src);
该函数将src指向的字符串添加到dest指向的字符串的末尾(包括\0结束符),dest字符串的空间必须足够大以容纳两个字符串的合并
#include <stdio.h>
#include <string.h>
int main() {
char dest[20] = "Hello, ";
char src[] = "World!";
strcat(dest, src);
printf("%s\n", dest); // 输出: Hello, World!
return 0;
}
strncat()函数原型
char *strncat(char *dest, const char *src, size_t n);
该函数将src指向的字符串中最多n个字符添加到dest指向的字符串的末尾,并在最后添加\0结束符。这个函数比strcat()更加安全,因为你可以控制添加到dest的最大字符数量。
#include <stdio.h>
#include <string.h>
int main() {
char dest[20] = "Hello, ";
char src[] = "World!";
strncat(dest, src, 6); // 6 是 "World!" 的长度,包括 '\0'
printf("%s\n", dest); // 输出: Hello, World!
return 0;
}
一定要确保dest数组有足够的空间来保存结果字符串,包括结束符\0。如果dest数组的空间不足,这些函数会造成缓冲区溢出,导致未定义行为(通常是程序崩溃或安全漏洞)。因此,在安全的代码中,推荐使用strncat()而不是strcat()。在使用strncat()时,必须清楚地知道目标数组剩余的空间大小,并传入正确的n值参数。
还有一个要注意的点是strncat()的实现方式,n参数表示的是src中最大复制的字符数量,而不是dest剩余空间的大小。换言之,即使传入的n大于src的长度,strncat()仍然会处理到src的’\0’结束符为止。