使用C语言实现字符串逆序操作
这篇文章主要介绍了使用C语言实现字符串逆序操作案例,本文包含使用C语言的两种方法去实现,递归和非递归,以下就是详细内容,需要的朋友可以参考下
编写一个函数 reverse_string(char * string)
实现:将参数字符串中的字符反向排列。
要求:不能使用C函数库中的字符串操作函数。比如:char arr[]="abcdef" 输出:fedcba
思路:(非递归)arr里存放的字符:
a b c d e f
输出后的arr里存放的字符:
f e d c b a
我们需要将字符a和字符f调换,字符b和字符e调换,字符c和字符d调换,怎么调换呢?这就需要指针
1.首先,我们写主函数
int main()
{
char arr[] = "abcdef";
reverse_string(arr);
printf("%sn", 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 != '') //这里不能用if,因为if是选择语句,不能实现循环
{
count++;
str++; //指向下一指针
}
return count;
}
//遇到停止循环
最终代码如下:
#include<stdio.h>
int my_strlen(char* str) //求字符串长度
{
int count = 0;
while(*str != '') //这里不能用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("%sn", arr); //%s是打印字符串格式
return 0;
}
输出结果:
递归思路:
a b c d e f abcdef的逆序可以看成a和f交换,加上bcde的逆序,然后bcde的逆序可以看成b和e交换加上cd的逆序,cd的逆序可以看成c和d交换
①将字符a取出来
b c d e f
a ②将字符f交换到a的位置
f b c d e
a ③在f的位置放''
f b c d e
a 为什么要放斜杠0?若将bcde传给函数reverse_string,完成不了逆序的实现,因为如果f所在的位置不是斜杠0,函数会判别后面还有字符,实现不了逆序,若放斜杠0,此时函数会将bcde看成字符串,实现逆序的功能
④将中间的bcde传给函数,实现逆序
⑤将字符a放在最开始字符f的位置
f b c d e a 通过上述步骤,我们可以发现④是个递归的过程
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 )= '';//对应步骤③ 可写成str[len-1]=''
//末尾置''方便计算字符串长度以及置换其他位置
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 != '') //这里不能用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) = '';//对应步骤③ 可写成str[len-1]=''
//末尾置''方便计算字符串长度以及置换其他位置
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("%sn", arr); //%s是打印字符串格式
return 0;
}
输出结果: