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

Đảo ngược chuỗi (Reverse string) trong C/C++

Đảo ngược chuỗi bằng cách hoán đổi ký tự đầu-cuối tiến dần về giữa.

C - In-place reversal (Với char array)

#include <stdio.h>
#include <string.h>

void reverseString(char* str) {
    if (!str) return;
    size_t len = strlen(str);
    for (size_t i = 0, j = len - 1; i < j; ++i, --j) {
        char tmp = str[i];
        str[i] = str[j];
        str[j] = tmp;
    }
}

int main() {
    char s[100];
    printf("Nhập chuỗi: ");
    fgets(s, sizeof(s), stdin);
    
    // Loại bỏ newline từ fgets
    s[strcspn(s, "\n")] = '\0';
    
    reverseString(s);
    printf("Chuỗi đảo: %s\n", s);
    return 0;
}

Kết quả

Nhập chuỗi: Hello World
Chuỗi đảo: dlroW olleH

C++ - std::string (Dễ dàng, an toàn)

#include <iostream>
#include <string>
#include <algorithm>

int main() {
    std::string s = "Hello World";
    
    // Cách 1: std::reverse (Khuyến nghị)
    std::reverse(s.begin(), s.end());
    std::cout << "Reversed: " << s << '\n';
    
    // Cách 2: Constructor từ reverse iterator
    std::string rev(s.rbegin(), s.rend());
    std::cout << "New string: " << rev << '\n';
    
    // Cách 3: Manual loop
    for (size_t i = 0, j = s.size() - 1; i < j; ++i, --j) {
        std::swap(s[i], s[j]);
    }
    
    return 0;
}

Kết quả

Reversed: dlroW olleH
New string: dlroW olleH

C++ - Unicode/UTF-8 (Phức tạp hơn)

#include <iostream>
#include <string>
#include <vector>

// Đảo ngược grapheme cluster (Unicode đúng) cần ICU hoặc thư viện chuyên dụng
// Ví dụ đơn giản với UTF-8 code points:
std::string reverseUtf8(const std::string& input) {
    std::vector codepoints;
    for (size_t i = 0; i < input.size(); ) {
        unsigned char c = input[i];
        size_t len = (c < 0x80) ? 1 : (c < 0xE0) ? 2 : (c < 0xF0) ? 3 : 4;
        codepoints.emplace_back(input.substr(i, len));
        i += len;
    }
    std::string result;
    for (auto it = codepoints.rbegin(); it != codepoints.rend(); ++it) {
        result += *it;
    }
    return result;
}

So sánh phương pháp

Lưu ý

  • C: Không dùng gets() (deprecated, buffer overflow). Dùng fgets()
  • String literal "hello" là read-only - không reverse in-place được
  • C++: std::string quản lý bộ nhớ tự động, an toàn hơn
Phương phápNgôn ngữIn-placeAn toànUnicode
Manual swapC/C++CóCần check null/sizeKhông (byte-level)
std::reverseC++CóCóCode point level
rbegin/rend constructorC++Không (tạo mới)CóCode point level
ICU/Boost.LocaleC++TùyCóGrapheme cluster (đúng)