当前位置:   article > 正文

使用C语言实现字符串逆序操作_c语言字符串逆序

c语言字符串逆序

这篇文章主要介绍了使用C语言实现字符串逆序操作案例,本文包含使用C语言的两种方法去实现,递归和非递归,以下就是详细内容,需要的朋友可以参考下

编写一个函数 reverse_string(char * string)
实现:将参数字符串中的字符反向排列。
要求:不能使用C函数库中的字符串操作函数。比如:char arr[]="abcdef" 输出:fedcba

思路:(非递归)arr里存放的字符:

 
abcdef\0
输出后的arr里存放的字符:
fedcba\0

我们需要将字符a和字符f调换,字符b和字符e调换,字符c和字符d调换,怎么调换呢?这就需要指针

1.首先,我们写主函数

  1. int main()
  2. {
  3. char arr[] = "abcdef";
  4. reverse_string(arr);
  5. printf("%s\n", arr); //%s是打印字符串格式
  6. return 0;
  7. }

有人问,everse_string(arr)调用函数时形参不是要用指针,实参那里应该是个地址啊,reverse_string(arr)中arr应该是&arr,但其实arr本身就是给地址,数组名arr就是arr首元素的地址,就是字符a

2.主函数写完后,我们写函数reverse_string

  1. void reverse_string(char* str)
  2. {
  3. int left = 0;
  4. int right = my_strlen(str) - 1;
  5. while (left < right)
  6. {
  7. char temp = str[left];
  8. str[left] = str[right];
  9. str[right] = temp;
  10. left++;
  11. right--;
  12. } //若left=right,不用交换字符
  13. }

为什么用void类型而不用int类型?因为这里传址改变的是数组arr里的元素顺序,不需要改变它的值,不需要返回数组,所以用void

这里left和right定义的是数组下标,left初始化为0,代表的是arr[0],即字符a,而right,我们想要让它定义字符f,也就是arr最后一个字符的下标,怎么做呢?我们可以先求字符串的长度,然后减1就是arr的最后一个字符位置,但是题目不能使用库函数中的字符串操作函数,所以我们要在函数reverse_string里嵌套另一个函数my_strlen,用来实现求字符串长度

3.编写函数my_strlen

  1. int my_strlen(char* str) //求字符串长度
  2. {
  3. int count = 0;
  4. while(*str != '\0') //这里不能用if,因为if是选择语句,不能实现循环
  5. {
  6. count++;
  7. str++; //指向下一指针
  8. }
  9. return count;
  10. }
  11. //遇到\0停止循环

最终代码如下:

  1. #include<stdio.h>
  2. int my_strlen(char* str) //求字符串长度
  3. {
  4. int count = 0;
  5. while(*str != '\0') //这里不能用if,因为if是选择语句,不能实现循环
  6. {
  7. count++;
  8. str++; //指向下一指针
  9. }
  10. return count;
  11. }
  12. void reverse_string(char* str)
  13. {
  14. int left = 0;
  15. int right = my_strlen(str) - 1;
  16. while (left < right)
  17. {
  18. char temp = str[left];
  19. str[left] = str[right];
  20. str[right] = temp;
  21. left++;
  22. right--;
  23. } //若left=right,不用交换字符
  24. }
  25. int main()
  26. {
  27. char arr[] = "abcdef";
  28. reverse_string(arr);
  29. printf("%s\n", arr); //%s是打印字符串格式
  30. return 0;
  31. }

 输出结果:

 

 递归思路:

abcdef\0
abcdef的逆序可以看成a和f交换,加上bcde的逆序,然后bcde的逆序可以看成b和e交换加上cd的逆序,cd的逆序可以看成c和d交换

①将字符a取出来

 bcdef\0
a

②将字符f交换到a的位置

fbcde\0
a

③在f的位置放'\0'

fbcde\0\0
a

为什么要放斜杠0?若将bcde传给函数reverse_string,完成不了逆序的实现,因为如果f所在的位置不是斜杠0,函数会判别后面还有字符,实现不了逆序,若放斜杠0,此时函数会将bcde看成字符串,实现逆序的功能

④将中间的bcde传给函数,实现逆序

⑤将字符a放在最开始字符f的位置

fbcdea

\0

通过上述步骤,我们可以发现④是个递归的过程

 reverse_string函数如下

  1. void reverse_string(char* str)
  2. {
  3. char temp = *str; // 对应步骤① 可写成char temp=str[0]; 代表字符a
  4. int len = my_strlen(str); //求字符串长度
  5. * str = *(str + len - 1 ); //对应步骤② 可写成str[0]=str[len-1]
  6. *(str + len - 1 )= '\0';//对应步骤③ 可写成str[len-1]='\0'
  7. //末尾置'\0'方便计算字符串长度以及置换其他位置
  8. if (my_strlen(str+1)>=2)
  9. {
  10. reverse_string(str + 1); //对应步骤④
  11. }
  12. //若不加if条件语句,调用函数没有判断条件,也就没有限制条件,就会导致死循环
  13. //当到cd交换时,中间无字符可逆序或者只剩下一个字符时,没必要逆序
  14. *(str + len - 1 )= temp;//对应步骤⑤ 可写成str[len-1]=temp 将末尾置换
  15. }

最终代码:

  1. #include<stdio.h>
  2. int my_strlen(char* str) //求字符串长度
  3. {
  4. int count = 0;
  5. while (*str != '\0') //这里不能用if,因为if是选择语句,不能实现循环
  6. {
  7. count++;
  8. str++; //指向下一指针
  9. }
  10. return count;
  11. }
  12. void reverse_string(char* str)
  13. {
  14. char temp = *str; // 对应步骤① 可写成char temp=str[0]; 代表字符a
  15. int len = my_strlen(str); //求字符串长度
  16. *str = *(str+len-1);//对应步骤② 可写成str[0]=str[len-1]
  17. *(str+len-1) = '\0';//对应步骤③ 可写成str[len-1]='\0'
  18. //末尾置'\0'方便计算字符串长度以及置换其他位置
  19. if (my_strlen(str + 1) >= 2)
  20. {
  21. reverse_string(str + 1); //对应步骤④
  22. }
  23. //若不加if条件语句,调用函数没有判断条件,也就没有限制条件,就会导致死循环
  24. //当到cd交换时,中间无字符可逆序或者只剩下一个字符时,没必要逆序
  25. *(str+len-1) = temp;//对应步骤⑤ 可写成str[len-1]=temp 将末尾置换
  26. }
  27. int main()
  28. {
  29. char arr[] = "abcdef";
  30. reverse_string(arr);
  31. printf("%s\n", arr); //%s是打印字符串格式
  32. return 0;
  33. }

输出结果:

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/643655
推荐阅读
相关标签
  

闽ICP备14008679号