Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> C++

Kiểu của string literal trong C/C++

String literal là chuỗi ký tự trong dấu ngoặc kép "...". Kiểu phụ thuộc vào prefix.

Các loại String Literal

PrefixKiểuMô tảVí dụ
(không)const char[N]Narrow string (ASCII/UTF-8)"hello"
Lconst wchar_t[N]Wide stringL"hello"
u8const char8_t[N] (C++20) / const char[N]UTF-8 encodedu8"hello"
uconst char16_t[N]UTF-16 encodedu"hello"
Uconst char32_t[N]UTF-32 encodedU"hello"
RTương ứngRaw string literal (không escape)R"(path\to\file)"

Ví dụ Wide String

#include <iostream>
#include <cwchar>
using namespace std;

int main() {
    wchar_t s[] = L"hello world!";
    
    wcout << L"The uppercase string: \"";
    for (size_t i = 0; i < wcslen(s); i++) {
        putwchar(towupper(s[i]));
    }
    wcout << L"\"" << endl;
    
    return 0;
}

Kết quả

The uppercase string: "HELLO WORLD!"

Raw String Literal (C++11)

Không cần escape ký tự đặc biệt. Cú pháp: R"delimiter(text)delimiter"

// Thay vì: "C:\\Users\\Name\\file.txt"
auto path = R"(C:\Users\Name\file.txt)";

// JSON/XML/Regex dễ đọc
auto json = R"({
    "name": "John",
    "age": 30
})";

// Delimiter tùy chỉnh (khi text chứa )")
auto sql = R"SQL(SELECT * FROM table WHERE name = "O'Brien")SQL";

Lưu ý quan trọng

  • String literal có static storage duration - tồn tại suốt chương trình
  • Kiểu là const - không được sửa đổi (UB nếu sửa)
  • String literal giống nhau có thể được merge (string pooling)
  • C++11: u8 cho UTF-8, C++20: char8_t type riêng
  • std::string constructor copy từ literal

So sánh với char array

char arr[] = "hello";  // Array trên stack, có thể sửa, size = 6
char* ptr = "hello";   // Trỏ đến literal (read-only), DEPRECATED C++
const char* ptr2 = "hello"; // Đúng
std::string s = "hello"; // Copy vào string object