首页 > 编程语言 >C++字符串String和字符串字面量String Literals

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

时间:2024-07-14 20:01:40浏览次数:19  
标签:std Literals 字面 cout 字符串 include string String

在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

相关文章

  • 代码随想录算法训练营第10天|232. 用栈实现队列,225. 用队列实现栈,20. 有效的括号,1047.
    学习任务:Leetcode232.用栈实现队列Leetcode225.用队列实现栈Leetcode20.有效的括号Leetcode1047.删除字符串中的所有相邻重复项Leetcode232.用栈实现队列难度:简单|相关标签:栈、设计、队列题目:请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支......
  • 判断字符串相等
    “==”操作符用于比较两个对象的地址是否相等。.equals()方法用于比较两个对象的内容是否相等。Strings1=newString("hh");Strings2=newString("hh");//trueSystem.out.println(s1.equals(s2));//falseSystem.out.println(s1==s2);Object类的equals()/......
  • 字符串拼接
    StringBuilder的append()Strings1="ha";Strings2="xi";//编译的时候被替换成newStringBuilder(s1).append(s2).toString();System.out.println(s1+s2);Strings1="ha";//+号也被编译成了append()Strings2=s1+"";System.ou......
  • 字符串常量池
    newString()创建了几个对象//使用new,每次都会创建一个新的对象Strings=newString("hh");先在位于堆中的字符串常量池中查找是否已经存在hh字符串对象如果有,直接在堆中创建一个hh字符串对象,然后把这个堆中新创建的对象地址返回给栈中的变量s如果没有,现在字符串常量池......
  • StringBuffer和StringBuilder
    publicfinalclassStringBufferextendsAbstractStringBuilderimplementsSerializable,CharSequence{publicStringBuffer(){super(16);}publicsynchronizedStringBufferappend(Stringstr){super.append(str);r......
  • 字符串源码
    String类的声明//final不可被继承publicfinalclassStringimplementsjava.io.Serializable,Comparable<String>,CharSequence{}比较字符串内容publicbooleanequals(ObjectanObject){//检查是否是同一个对象的引用,如果是,直接返回trueif(this......
  • Check if String is Happy
    Astringishappyifeverythreeconsecutivecharactersaredistinct.defcheck_if_string_is_happy1(input_str): check=[] fora,b,cinzip(input_str,input_str[1:],input_str[2:]): ifa==borb==cora==c: check.append(False) else: check......
  • flutter pub get 的时候:A dependency specification must be a string or a mapping.
    想在pubspec.yaml文件中添加字体:报错了fonts:-family:MiaoZifonts:-asset:assets/fonts/MiaoZi-YunYingTi-2.ttfweight:500看了这篇文章解决了我原来是加在dependencies:flutter:sdk:flutter#新添加的依赖fonts:......
  • 【模板】字符串
    字符串哈希素数:13110612e6+931e7+192e7+933e7+231e9+97LL(1e16)+61Zfunctionn=strlen(s+1),m=strlen(t+1);z[1]=n;For(i,2,n,l=0,r=0){ if(i<=r)z[i]=min(z[i-l+1],r-i+1); while(s[z[i]+1]==s[i+z[i]])++z[i]; if(i+z[i]-1>......
  • 24暑假算法刷题 | Day9 | LeetCode 151. 反转字符串中的单词,28. 找出字符串中第一个匹
    目录151.反转字符串中的单词题目描述题解28.找出字符串中第一个匹配项的下标题目描述题解459.重复的子字符串题目描述题解卡码网55.右旋字符串题目描述题解151.反转字符串中的单词点此跳转题目链接题目描述给你一个字符串s,请你反转字符串中单词的顺......