C++字符串String和字符串字面量String Literals

在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++中的字符串操作丰富且强大,合理使用这些工具可以大大简化文本处理任务。

  • 37
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值