在C++中,字符串(String)是一种用于表示和处理文本数据的基本类型。C++提供了两种主要的字符串类型:
- C风格字符串(C-Style String):使用字符数组表示。
- 标准库字符串(std::string):使用标准库中的std::string类表示。
1. C风格字符串
C风格字符串是一个以空字符(\0)结尾的字符数组。以下是一些常见的操作:
1.1 声明和初始化
#include <iostream>
int main() {
// 声明一个字符数组并初始化
char str1[] = "Hello, world!";
// 声明一个字符数组,未初始化
char str2[20];
// 逐个字符初始化
char str3[] = {'H', 'e', 'l', 'l', 'o', '\0'};
std::cout << "str1: " << str1 << std::endl;
std::cout << "str3: " << str3 << std::endl;
return 0;
}
1.2 常见操作
复制字符串、连接字符串、获取字符串长度、比较字符串
#include <iostream>
#include <cstring> // 包含字符串操作函数
int main() {
char str1[20] = "Hello";
char str2[20];
// 复制字符串
strcpy(str2, str1);
std::cout << "str2: " << str2 << std::endl;
// 连接字符串
strcat(str1, ", world!");
std::cout << "str1: " << str1 << std::endl;
// 获取字符串长度
std::cout << "Length of str1: " << strlen(str1) << std::endl;
// 比较字符串
if (strcmp(str1, str2) == 0) {
std::cout << "str1 and str2 are equal" << std::endl;
} else {
std::cout << "str1 and str2 are not equal" << std::endl;
}
return 0;
}
2. 标准库字符串(std::string)
std::string
是C++标准库提供的字符串类,功能更强大,使用更方便。以下是一些常见的操作:
2.1 声明和初始化
#include <iostream>
#include <string> // 包含std::string类
int main() {
// 声明并初始化std::string
std::string str1 = "Hello, world!";
std::string str2("C++ string");
std::string str3 = str1;
std::cout << "str1: " << str1 << std::endl;
std::cout << "str2: " << str2 << std::endl;
std::cout << "str3: " << str3 << std::endl;
return 0;
}
2.2 常见操作
#include <iostream>
#include <string>
int main() {
std::string str1 = "Hello";
std::string str2;
// 复制字符串
str2 = str1;
std::cout << "str2: " << str2 << std::endl;
// 连接字符串
str1 += ", world!";
std::cout << "str1: " << str1 << std::endl;
// 获取字符串长度
std::cout << "Length of str1: " << str1.length() << std::endl;
// 比较字符串
if (str1 == str2) {
std::cout << "str1 and str2 are equal" << std::endl;
} else {
std::cout << "str1 and str2 are not equal" << std::endl;
}
// 查找子字符串
std::size_t found = str1.find("world");
if (found != std::string::npos) {
std::cout << "'world' found at: " << found << std::endl;
} else {
std::cout << "'world' not found" << std::endl;
}
// 提取子字符串
std::string str3 = str1.substr(7, 5);
std::cout << "Substring: " << str3 << std::endl;
return 0;
}
3. C风格字符串与std::string的互操作
C风格字符串和std::string可以互相转换:
#include <iostream>
#include <string>
#include <cstring>
int main() {
// C风格字符串转std::string
const char* cstr = "C-style string";
std::string str = cstr;
std::cout << "std::string: " << str << std::endl;
// std::string转C风格字符串
std::string cppstr = "C++ string";
const char* cstr2 = cppstr.c_str();
std::cout << "C-style string: " << cstr2 << std::endl;
return 0;
}
4. 字符串流(std::stringstream)
std::stringstream
是C++标准库提供的字符串流类,用于在字符串和其他数据类型之间进行转换。
#include <iostream>
#include <sstream> // 包含std::stringstream类
int main() {
std::stringstream ss;
// 向字符串流中插入数据
ss << "Hello, " << "world! " << 123 << " " << 4.56;
// 获取字符串流的内容
std::string str = ss.str();
std::cout << "String stream content: " << str << std::endl;
// 从字符串流中提取数据
std::string word;
int number;
double decimal;
ss >> word >> word >> number >> decimal;
std::cout << "Extracted word: " << word << std::endl;
std::cout << "Extracted number: " << number << std::endl;
std::cout << "Extracted decimal: " << decimal << std::endl;
return 0;
}
5. 字符串字面量(String Literals)
5.1 基本概念
字符串字面量是源代码中直接写出来的字符串常量。它们是以双引号 " 包围的一系列字符。字符串字面量有几种不同的类型,包括普通字符串字面量、宽字符串字面量、UTF-8、UTF-16、UTF-32 字符串字面量等。
示例代码
#include <iostream> // 用于 std::cout 和 std::wcout
#include <locale> // 用于设置区域设置(处理宽字符)
int main() {
// 普通字符串字面量
const char* str = "Hello, World!";
std::cout << str << std::endl;
// 宽字符串字面量
const wchar_t* wstr = L"Hello, World!";
std::wcout.imbue(std::locale("")); // 设置区域设置
std::wcout << wstr << std::endl;
// UTF-8 字符串字面量
const char* utf8str = u8"Hello, World!";
std::cout << utf8str << std::endl;
// UTF-16 字符串字面量
const char16_t* utf16str = u"Hello, World!";
// 需要转换为宽字符串以显示
std::wcout << reinterpret_cast<const wchar_t*>(utf16str) << std::endl;
// UTF-32 字符串字面量
const char32_t* utf32str = U"Hello, World!";
// 需要转换为宽字符串以显示
std::wcout << reinterpret_cast<const wchar_t*>(utf32str) << std::endl;
// 原始字符串字面量
const char* rawstr = R"(Hello, "World"!)";
std::cout << rawstr << std::endl;
// 多行字符串字面量
const char* multilineStr = R"(This is a
multi-line
string literal.)";
std::cout << multilineStr << std::endl;
// 合并字符串字面量
const char* mergedStr = "Hello, " "World!";
std::cout << mergedStr << std::endl;
return 0;
}
5.2 字符串字面量和字符串的区别
字符串和字符串字面量在C++中不是同一个概念,它们有不同的定义和用途。
字符串字面量用于表示不可变的字符序列,而 字符串提供了丰富的功能用于操作和处理字符串。
区别
(1)类型
字符串字面量是编译时常量,类型是 const char*、const wchar_t*、const char16_t*、const char32_t* 等。
字符串std::string 和 std::wstring 是标准库中的类,表示动态字符串,提供了丰富的操作函数。
(2)存储:
字符串字面量通常存储在只读内存区。
字符串std::string 和 std::wstring 对象是动态分配的,可以在运行时修改其内容。
(3)功能:
字符串字面量只能表示简单的字符序列,没有提供任何操作函数。
字符串std::string 和 std::wstring 提供了丰富的成员函数和操作符,用于字符串的操作和处理。
5.3 C++14 字符串字面量后缀加s新用法
在C++中,字符串字面量后缀 s 是C++14引入的一种用户定义字面量(User-Defined Literals),它用于创建 std::string 对象。使用 s 后缀可以直接将字符串字面量转换为 std::string 类型,而不需要显式调用构造函数。
要使用这个功能,需要包含头文件 并使用 std::literals::string_literals 命名空间。以下是详细的解释和示例代码:
示例代码
以下是一个示例代码,展示了如何使用 s 后缀将字符串字面量转换为 std::string 对象:
#include <iostream>
#include <string> // 用于使用 std::string 类型
using namespace std::literals::string_literals; // 启用 s 后缀的用户定义字面量
int main() {
// 使用 s 后缀将字符串字面量转换为 std::string 对象
std::string str1 = "Hello, World!"s;
std::string str2 = "Another string literal"s;
// 输出 std::string 对象
std::cout << str1 << std::endl;
std::cout << str2 << std::endl;
// std::string 对象的操作
std::string combined = str1 + " " + str2;
std::cout << combined << std::endl;
return 0;
}
注意事项
- 命名空间:必须使用 std::literals::string_literals 或 std::string_literals 命名空间,否则编译器无法识别 s 后缀。
- C++14:该特性在C++14及以上版本中可用,确保你的编译器支持C++14或更高版本。
使用 s 后缀可以使代码更加简洁和直观,尤其是在需要频繁使用 std::string 对象的场合。
总结
- C风格字符串:使用字符数组表示,以空字符结尾。常用库中的函数进行操作。
- 标准库字符串(std::string):功能强大,使用方便,是C++中处理字符串的推荐方式。
- C风格字符串与std::string的互操作:可以方便地互相转换。
- 字符串流(std::stringstream):用于在字符串和其他数据类型之间进行转换。
C++中的字符串操作丰富且强大,合理使用这些工具可以大大简化文本处理任务。
标签:std,Literals,字面,cout,字符串,include,string,String From: https://blog.csdn.net/Simona_Wu/article/details/140402079