本文最后更新于 2026-03-05,文章内容可能已经过时。

在C语言中,字符串逆置最推荐使用循环法(通过交换首尾字符实现),它高效直接、无需额外空间且是标准C的通用实现;避免使用非标准的strrev函数(如某些编译器提供但不跨平台);递归法虽可行但效率较低;实现时需注意正确计算字符串长度(用strlen)、处理输入安全(如用fgets避免溢出)并保留原字符串时可创建新数组。

字符串逆置是指将字符串中的字符顺序完全反转。在C语言中,有多种实现字符串逆置的方法。

一、循环法(非递归实现)

这是最常用、最直观的方法,通过两个指针从字符串两端向中间移动,交换字符。

代码实现:

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

void reverse_string(char str[]) {
    int length = strlen(str); // 获取字符串长度
    for (int i = 0; i < length / 2; i++) {
        // 交换字符
        char temp = str[i];
        str[i] = str[length - i - 1];
        str[length - i - 1] = temp;
    }
}

int main() {
    char input[100];
    printf("请输入一个字符串:");
    fgets(input, sizeof(input), stdin);
    // 去掉换行符
    input[strcspn(input, "\n")] = '\0';
    
    reverse_string(input);
    printf("逆置后的字符串是:%s\n", input);
    return 0;
}

说明:

  1. 使用strlen函数获取字符串长度
  2. 通过循环,将字符串首尾字符交换,直到中间位置
  3. 该方法直接修改原字符串,不需要额外空间

二、递归法

递归法将问题分解为更小的子问题,直到达到基本情况。

代码实现(数组方式):

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

int my_strlen(char *str) {
    int count = 0;
    while (*str != '\0') {
        str++;
        count++;
    }
    return count;
}

void reverse_string(char str[], int left, int right) {
    if (left < right) {
        char temp = str[left];
        str[left] = str[right];
        str[right] = temp;
        reverse_string(str, left + 1, right - 1);
    }
}

int main() {
    char str[20];
    printf("请输入字符串:>");
    scanf("%s", str);
    
    int left = 0;
    int right = my_strlen(str) - 1;
    reverse_string(str, left, right);
    
    printf("逆序的字符串:%s\n", str);
    return 0;
}

递归法(指针方式):

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

int my_strlen(char *str) {
    int count = 0;
    while (*str != '\0') {
        str++;
        count++;
    }
    return count;
}

void reverse_string(char *str) {
    char temp = *str;
    int len = my_strlen(str);
    *str = *(str + len - 1);
    *(str + len - 1) = '\0';
    
    if (my_strlen(str + 1) >= 2) {
        reverse_string(str + 1);
    }
    
    *(str + len - 1) = temp;
}

int main() {
    char str[20];
    printf("请输入字符串:>");
    scanf("%s", str);
    
    reverse_string(str);
    printf("逆序的字符串:%s\n", str);
    return 0;
}

三、注意事项

  1. 标准库函数:C标准库中没有strrev函数(有些编译器如TC可能提供,但不是标准C的一部分)。所以不建议使用strrev,因为它不是可移植的。

  2. 字符串长度:使用strlen获取字符串长度时,注意它不包括终止符\0

  3. 字符串输入:使用fgetsgets更安全,可以防止缓冲区溢出。

  4. 内存处理:上述方法都是直接修改原字符串,如果需要保留原字符串,可以创建一个新字符串来存储逆置结果。

四、其他方法

创建新数组存储逆置结果

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

int main() {
    char str[100];
    char rev_str[100];
    int i, len;
    
    printf("请输入字符串:");
    fgets(str, sizeof(str), stdin);
    str[strcspn(str, "\n")] = '\0'; // 去掉换行符
    
    len = strlen(str);
    for (i = 0; i < len; i++) {
        rev_str[i] = str[len - i - 1];
    }
    rev_str[len] = '\0'; // 添加终止符
    
    printf("逆置后的字符串:%s\n", rev_str);
    return 0;
}

总结

  • 循环法:简单高效,是实现字符串逆置的首选方法
  • 递归法:理解起来可能较难,但展示了递归思想
  • 新数组法:保留原字符串,但需要额外空间

对于大多数应用场景,推荐使用循环法实现字符串逆置,因为它简单、高效且易于理解。

以上实现均基于C标准库,可以在各种C编译器中运行,不需要依赖特定的扩展函数。