字符串逆序-c语言

本文介绍了一种使用C语言实现字符串逆序的方法。通过从字符串两端向中间逐步交换字符来达到逆序的目的。该方法简单实用,适用于初学者学习。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

给定一个含有n个元素的字符串,实现逆序。

 

这是个很基础的问题,实现方式也是很常见的c语言思路。虽然简单,但是仍然记录下来。

[期望]

比如char str[] = "abcdefg";

逆序后为:"gfedcba";

[思路]
分别从字符串的头和尾部向中间进发,依次交换头尾的值,直到在中间相遇。


代码:

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

void print_str(char *str)
{
    int i,len;
    if (str == NULL) {
        return;
    }
    len = strlen(str);
    for(i=0; i<len; i++) {
        printf("%c",str[i]);
    }
    printf("\n");
}

void str_reverse(char *str, int left, int right)
{
    char tmp;
    while(left < right) {
        tmp = str[left];
        str[left++] = str[right];
        str[right--] = tmp;
    }   
}

void str_reverse_test()
{
    char str[] = "abcdefg";
    str_reverse_1(str, 0, strlen(str)-1);
    print_str(str);
}

void main()
{
    str_reverse_test();
}
View Code

 


至于函数原型为什么不定义成void str_rev(char *str);或者void str_rev(char *str, int len);,
而是定义成void str_rev(char *str, int left, int right); 后面的文章会解释,也会用到它。

转载于:https://www.cnblogs.com/bugchecker/p/3618384.html

<think>好的,用户需要C语言实现字符串逆序输出的示例代码。首先,我要回忆一下常见的几种方法。根据提供的引用,有指针法、递归法和数组下标法。 先看指针法。引用[1]和[3]中的例子,都是使用左右指针交换字符。确定字符串长度后,left指向开头,right指向末尾减一。然后循环交换,直到指针相遇。这种方法效率高,时间复杂度是O(n),空间复杂度是O(1)。 然后是递归法。引用中没有直接提到,但常见方法可以拆分字符串,每次处理首尾字符,递归中间部分。需要注意递归的终止条件,比如当字符串长度小于等于1时返回。这种方法虽然代码简洁,但递归深度可能较大,长字符串可能导致栈溢出。 数组下标法在引用[4]中也有体现,使用循环找到字符串末尾,然后通过下标递减交换字符。和指针法类似,只是用下标代替指针操作,适合对指针不太熟悉的用户。 用户可能需要不同的实现方式,所以应该提供多种方法。需要确保代码示例正确,比如指针交换时的临时变量类型是否正确,循环条件是否正确。例如,引用[1]中的代码将tmp声明为char*,但应该是char类型,因为交换的是字符内容而不是指针本身。这可能需要纠正。 另外,用户可能关心代码的可读性和效率。指针法和数组下标法效率相当,而递归法则在可读性上有优势,但效率较低。需要指出每种方法的优缺点,帮助用户选择合适的方法。 还要检查代码是否包含必要的头文件,比如stdio.h和string.h,以及main函数的正确实现。例如,引用[3]中的reverse函数是否正确处理了字符串长度,是否有越界风险。 最后,生成相关问题时要围绕逆序的实现方法、不同方法的比较、错误处理(如空指针或空字符串)以及应用场景。确保问题对用户有进一步的帮助。</think>### C语言字符串逆序输出的实现方法 #### 方法一:指针交换法(时间复杂度$O(n)$) 通过双指针从字符串首尾向中间移动,逐步交换字符。这是最高效的实现方式。 ```c #include <stdio.h> #include <string.h> void reverse_string(char* str) { int len = strlen(str); char* left = str; char* right = str + len - 1; while (left < right) { char tmp = *left; // 正确类型应为char而非char* *left = *right; *right = tmp; left++; right--; } } int main() { char arr[1000] = {0}; gets(arr); reverse_string(arr); printf("%s\n", arr); return 0; } ``` 特点:原地修改字符串,无需额外内存[^1][^3] #### 方法二:递归实现(时间复杂度$O(n)$) 通过递归栈实现逆序,代码简洁但栈空间消耗较大 ```c #include <stdio.h> void reverse_recursive(char* str, int start, int end) { if (start >= end) return; char temp = str[start]; str[start] = str[end]; str[end] = temp; reverse_recursive(str, start+1, end-1); } int main() { char str[] = "Hello World"; int len = strlen(str); reverse_recursive(str, 0, len-1); printf("%s", str); return 0; } ``` 注意:递归深度与字符串长度成正比,长字符串可能栈溢出 #### 方法三:数组下标法 ```c #include <stdio.h> #include <string.h> void reverse_array(char arr[]) { int len = strlen(arr); for (int i=0; i < len/2; i++) { char temp = arr[i]; arr[i] = arr[len-1-i]; arr[len-1-i] = temp; } } ``` 特点:适合不熟悉指针操作的学习者[^4]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值