赞
踩
这篇文章主要介绍了使用C语言实现字符串逆序操作案例,本文包含使用C语言的两种方法去实现,递归和非递归,以下就是详细内容,需要的朋友可以参考下
编写一个函数 reverse_string(char * string)
实现:将参数字符串中的字符反向排列。
要求:不能使用C函数库中的字符串操作函数。比如:char arr[]="abcdef" 输出:fedcba
思路:(非递归)arr里存放的字符:
a b c d e f \0
输出后的arr里存放的字符:
f e d c b a \0
我们需要将字符a和字符f调换,字符b和字符e调换,字符c和字符d调换,怎么调换呢?这就需要指针
1.首先,我们写主函数
- int main()
- {
- char arr[] = "abcdef";
- reverse_string(arr);
- printf("%s\n", arr); //%s是打印字符串格式
- return 0;
- }
有人问,everse_string(arr)调用函数时形参不是要用指针,实参那里应该是个地址啊,reverse_string(arr)中arr应该是&arr,但其实arr本身就是给地址,数组名arr就是arr首元素的地址,就是字符a
2.主函数写完后,我们写函数reverse_string
- void reverse_string(char* str)
- {
- int left = 0;
- int right = my_strlen(str) - 1;
- while (left < right)
- {
- char temp = str[left];
- str[left] = str[right];
- str[right] = temp;
- left++;
- right--;
- } //若left=right,不用交换字符
- }
为什么用void类型而不用int类型?因为这里传址改变的是数组arr里的元素顺序,不需要改变它的值,不需要返回数组,所以用void
这里left和right定义的是数组下标,left初始化为0,代表的是arr[0],即字符a,而right,我们想要让它定义字符f,也就是arr最后一个字符的下标,怎么做呢?我们可以先求字符串的长度,然后减1就是arr的最后一个字符位置,但是题目不能使用库函数中的字符串操作函数,所以我们要在函数reverse_string里嵌套另一个函数my_strlen,用来实现求字符串长度
3.编写函数my_strlen
- int my_strlen(char* str) //求字符串长度
- {
- int count = 0;
- while(*str != '\0') //这里不能用if,因为if是选择语句,不能实现循环
- {
- count++;
- str++; //指向下一指针
- }
- return count;
- }
-
- //遇到\0停止循环
最终代码如下:
- #include<stdio.h>
- int my_strlen(char* str) //求字符串长度
- {
- int count = 0;
- while(*str != '\0') //这里不能用if,因为if是选择语句,不能实现循环
- {
- count++;
- str++; //指向下一指针
- }
- return count;
- }
-
- void reverse_string(char* str)
- {
- int left = 0;
- int right = my_strlen(str) - 1;
- while (left < right)
- {
- char temp = str[left];
- str[left] = str[right];
- str[right] = temp;
- left++;
- right--;
- } //若left=right,不用交换字符
- }
-
- int main()
- {
- char arr[] = "abcdef";
- reverse_string(arr);
- printf("%s\n", arr); //%s是打印字符串格式
- return 0;
- }
输出结果:
递归思路:
abcdef的逆序可以看成a和f交换,加上bcde的逆序,然后bcde的逆序可以看成b和e交换加上cd的逆序,cd的逆序可以看成c和d交换
a b c d e f \0 ①将字符a取出来
b c d e f \0
a ②将字符f交换到a的位置
f b c d e \0
a ③在f的位置放'\0'
f b c d e \0 \0
a 为什么要放斜杠0?若将bcde传给函数reverse_string,完成不了逆序的实现,因为如果f所在的位置不是斜杠0,函数会判别后面还有字符,实现不了逆序,若放斜杠0,此时函数会将bcde看成字符串,实现逆序的功能
④将中间的bcde传给函数,实现逆序
⑤将字符a放在最开始字符f的位置
通过上述步骤,我们可以发现④是个递归的过程
f b c d e a \0
reverse_string函数如下
- void reverse_string(char* str)
- {
- char temp = *str; // 对应步骤① 可写成char temp=str[0]; 代表字符a
- int len = my_strlen(str); //求字符串长度
- * str = *(str + len - 1 ); //对应步骤② 可写成str[0]=str[len-1]
- *(str + len - 1 )= '\0';//对应步骤③ 可写成str[len-1]='\0'
- //末尾置'\0'方便计算字符串长度以及置换其他位置
- if (my_strlen(str+1)>=2)
- {
- reverse_string(str + 1); //对应步骤④
- }
- //若不加if条件语句,调用函数没有判断条件,也就没有限制条件,就会导致死循环
- //当到cd交换时,中间无字符可逆序或者只剩下一个字符时,没必要逆序
- *(str + len - 1 )= temp;//对应步骤⑤ 可写成str[len-1]=temp 将末尾置换
- }
最终代码:
- #include<stdio.h>
- int my_strlen(char* str) //求字符串长度
- {
- int count = 0;
- while (*str != '\0') //这里不能用if,因为if是选择语句,不能实现循环
- {
- count++;
- str++; //指向下一指针
- }
- return count;
- }
-
-
- void reverse_string(char* str)
- {
- char temp = *str; // 对应步骤① 可写成char temp=str[0]; 代表字符a
- int len = my_strlen(str); //求字符串长度
- *str = *(str+len-1);//对应步骤② 可写成str[0]=str[len-1]
- *(str+len-1) = '\0';//对应步骤③ 可写成str[len-1]='\0'
- //末尾置'\0'方便计算字符串长度以及置换其他位置
- if (my_strlen(str + 1) >= 2)
- {
- reverse_string(str + 1); //对应步骤④
- }
- //若不加if条件语句,调用函数没有判断条件,也就没有限制条件,就会导致死循环
- //当到cd交换时,中间无字符可逆序或者只剩下一个字符时,没必要逆序
- *(str+len-1) = temp;//对应步骤⑤ 可写成str[len-1]=temp 将末尾置换
- }
-
- int main()
- {
- char arr[] = "abcdef";
- reverse_string(arr);
- printf("%s\n", arr); //%s是打印字符串格式
- return 0;
- }
输出结果:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。