C语言,求一个字符串的逆序

char *strreverse(char *dest,char *src)//反转字符串,have tested
{
 /*
 把字符串的两头进行掉换,这样即省资源又降低了复杂度,还有一问题,可能有dest==src
 */
 /*
 在写此程序时考虑的问题:(我写程序时总考虑一些问题,列举出多不可行的办法
 所以我写程序的时候很犹豫)

 如果函数入口的变量为(char **dest,char *src);那么可以为他直接分配一个空间
 哦,明白,这违背了多占用了空间的原则

 如果还是用原来接口即:(char *dest,char *src)那么,就分两种情况考虑:
 第一,当dest==src也就说是输入等输出的时候
 第二,就是当dest的空间大小不够了,其实按照strcpy()这函数来讲,这问题不应
 是在这个程序里边考虑的问题,因为dest的空间在调用此函数之前必须保证足够,
 要不会出现问题.那我这程序也在这种保证下编写的,当然,会进行检查的
 */
 int srclen=strlen(src);
 int destlen=strlen(dest);
 char c;
 if(destlen<srclen)
  return NULL;
 if (dest==src)//是以自己为输入输出的,这种方式就用两边对换的方法
 {
  destlen=destlen/2;
  while (srclen>destlen)
  {
   c=*src;
   *src=*(dest+srclen-1);
   *(dest+srclen-1)=c;
   src++;
   srclen--;
  }
 }
 else//输入和输出不相等,那么要进行所有的对换啊
 {
  while (srclen>0)
  {
   *dest++=*(src+srclen-1);
   srclen--;
  }
  *dest=0;//把/0给dest
 }
 return src;
}

 

//--------------------------后记-------------

如果输入同时也为输出的时候,请要搞清楚src和dest是不是常量,如果是的话,运行的时候会出错误,而编译的时候没什么问题例如你这样调用本函数:

int main(viod)

{

char * str="abcdefg";

strreverse(str,str);//这样是错误的,因为str为常量,不能做为输出的

}

//当然,解决上述问题,只需用改一个输出(char *dest)类型就行了,把它改成(char **str)然后再里边为动态的分配一个栈,可是我写这个算法的时候是要求在空间和时间上都要有优势,所以我并没有那么干,这样也带来了一定的不协调,呵呵

<think>好的,用户想用C语言实现字符串逆序输出的功能。首先,我需要回忆一下相关的字符串处理方法和指针操作。根据提供的引用资料,有几个不同的实现方法,用户可能需要一个简单明了的示例代码。 首先,用户的问题是关于字符串逆序输出,而引用中提到的例子有几种不同的方法,比如使用双指针交换字符,或者创建一个新的字符串来存储逆序后的结果。考虑到效率和简洁性,双指针的方法可能更优,因为它可以在原字符串上进行操作,不需要额外的空间。 接下来,我需要确定用户是否需要输出逆序后的字符串,还是仅仅逆序输出但原字符串不变。根据引用中的代码示例,大部分方法都是直接修改原字符串,然后输出。例如,引用3中的reverse函数就是直接修改传入的数组。因此,示例代码可能需要展示如何原地逆序字符串并输出。 另外,用户提到的“逆序输出”可能有两种理解:一种是修改原字符串并输出,另一种是不修改原字符串,仅逆序打印。根据引用中的例子,大部分是修改原字符串,所以可能需要明确这一点。但根据问题描述,用户可能想要的是逆序后的字符串输出,不管原字符串是否被修改。 然后,我需要检查各个引用的代码是否正确。例如,引用1中的代码使用了指针交换,是正确的。引用3中的reverse函数也是类似的逻辑。而引用4中的方法是将字符逐个复制到目标数组,从后往前取字符,这可能适用于不修改原字符串的情况。因此,可能需要提供两种方法:原地逆序和创建新字符串逆序。 但用户的问题可能更倾向于原地逆序,因为大多数示例都是如此。因此,示例代码应该包括使用双指针交换字符的方法,并给出解释。 另外,需要注意字符串的结束符'\0',在操作时不能覆盖或移动它。因此,在计算长度时,应该正确获取字符串长度,并处理指针的位置,确保不越界。 最后,需要确保代码的正确性,比如循环条件是否正确(left < right),以及交换过程是否正确。例如,引用1中的代码在交换时使用了临时变量tmp,是正确的。而引用4中的nixu函数可能有问题,因为sizeof(char)是1,所以src + len -1可能更合适,但代码中使用了src + sizeof(char)*len - sizeof(char),这可能复杂化了,但实际效果是一样的。 因此,示例代码可以基于引用3或引用5中的代码,因为它们比较简洁。例如,使用reverse函数接受左右指针,并在主函数中调用,获取输入字符串,计算长度,调用reverse,然后输出。 总结步骤: 1. 获取输入字符串。 2. 计算字符串长度。 3. 定义左右指针,分别指向首尾字符。 4. 交换指针指向的字符,直到指针相遇。 5. 输出逆序后的字符串。 此外,需要处理可能的输入问题,比如使用gets可能存在缓冲区溢出的风险,可以考虑使用更安全的fgets,但用户提供的示例中使用了gets,所以示例代码可能沿用,但需要提醒用户注意。 最终,给出代码示例,并解释关键步骤,比如指针交换的过程,循环条件等。同时,可能生成相关问题,如不同方法的比较、如何处理动态内存字符串逆序输出的其他方法等。</think>### C语言实现字符串逆序输出示例代码 以下是两种常用实现方法,分别通过指针交换和数组索引实现字符串逆序输出: --- #### **方法1:双指针原地逆序(修改原字符串)** ```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; *left = *right; *right = tmp; left++; right--; } } int main() { char arr[1000] = {0}; printf("输入字符串: "); gets(arr); // 获取输入(注意:实际开发建议用fgets) reverse_string(arr); // 原地逆序 printf("逆序结果: %s\n", arr); return 0; } ``` **关键点** - 通过双指针$left$和$right$逐步向中间移动并交换字符,时间复杂度为$O(n)$[^1][^3] - 直接修改原字符串,节省内存空间 - `gets()`函数存在溢出风险,生产环境建议改用`fgets(arr, sizeof(arr), stdin)`[^5] --- #### **方法2:创建新字符串逆序(保留原字符串)** ```c #include <stdio.h> #include <string.h> void reverse_copy(char* dst, const char* src) { int len = strlen(src); const char* end = src + len - 1; // 源字符串末尾 for (int i = 0; i < len; i++) { dst[i] = *end--; // 从后向前复制字符 } dst[len] = '\0'; // 添加终止符 } int main() { char src[] = "Hello World!"; char dst[100] = {0}; reverse_copy(dst, src); // 生成逆序副本 printf("原字符串: %s\n", src); printf("逆序结果: %s\n", dst); return 0; } ``` **关键点** - 通过从后向前遍历原字符串,将字符写入新数组$dst$,时间复杂度$O(n)$[^4] - 保留原字符串内容,适用于需要保留原始数据的场景 --- ###
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值