C语言 反转一个字符串

反转字符串是编程中常见的任务,尤其是对数组或字符串进行原地操作时。在 C 或 C++ 中,反转字符串通常涉及使用指针或数组交换字符。最推荐的做法是使用指针交换法,因为它不仅效率高,而且不需要额外的内存分配。

1、使用指针交换字符

C 中,可以使用两个指针,一个指向字符串的开头,另一个指向字符串的末尾,交换它们指向的字符,直到指针相遇。

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

void reverse_string(char *str) {
    int start = 0;
    int end = strlen(str) - 1;
    
    // 交换字符直到两个指针相遇
    while (start < end) {
        // 交换
        char temp = str[start];
        str[start] = str[end];
        str[end] = temp;
        
        // 移动指针
        start++;
        end--;
    }
}

int main() {
    char str[] = "Hello, World!";
    printf("Original string: %s\n", str);
    
    reverse_string(str);
    
    printf("Reversed string: %s\n", str);
    
    return 0;
}

2、使用数组和栈

如想避免直接使用指针交换字符,也可以使用栈来反转字符串。这种方法通常不是最有效的,但它提供了一种不同的解决思路。

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

void reverse_string(char *str) {
    int length = strlen(str);
    char temp[length + 1];
    
    // 将字符串反向存入临时数组
    for (int i = 0; i < length; i++) {
        temp[i] = str[length - 1 - i];
    }
    temp[length] = '\0';  // 添加字符串终止符
    
    // 将反转后的字符串复制回原字符串
    strcpy(str, temp);
}

int main() {
    char str[] = "Hello, World!";
    printf("Original string: %s\n", str);
    
    reverse_string(str);
    
    printf("Reversed string: %s\n", str);
    
    return 0;
}

3、使用递归反转字符串

也可以使用递归来反转字符串,尽管这种方法不是最优的,因为它会增加函数调用的开销。

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

void reverse_string_recursive(char *str, int start, int end) {
    if (start >= end) {
        return;
    }
    
    // 交换字符
    char temp = str[start];
    str[start] = str[end];
    str[end] = temp;
    
    // 递归调用
    reverse_string_recursive(str, start + 1, end - 1);
}

int main() {
    char str[] = "Hello, World!";
    printf("Original string: %s\n", str);
    
    reverse_string_recursive(str, 0, strlen(str) - 1);
    
    printf("Reversed string: %s\n", str);
    
    return 0;
}

推荐阅读
cjavapy编程之路首页