字符串的倒置例子
?字符串倒置可以用递归的方法,也可以用非递归的方法;
1.非递归方法介绍:定义两个指针变量,分别指向该字符串的头和字符串的尾,对两个指针指向的地址做循环判断,是否前面指针指向的地址小于后面指针指向的地址,循环里面交换两个指针所指向的字符,利用一个中间变量,然后前面的指针++;后面的指针减减;
void reverse(char* l, char* r)
{
while (l < r)//判断前地址是否小于后地址
{
int tmp = *l;
*l = *r;
*r = tmp;//交换字符
l++;前指针后移
r--;后指针前移
}
}
int main()
{char arr[] = "abcdef";
int len = strlen(arr);//获取字符长度
char* left = arr;//指针指向前面
char* right = arr+len-1;//指针指向后面
reverse(left, right);//字符交换函数传入两个地址
printf("%s", arr);
}
2.递归方法介绍:比如说是abcdef,递归的话可以写个递归函数交换a和f,然后再用bcde去调用这个函数,这个条件的话就是字符串的长度大于等于2的话才去交换,小于2就结束
void?reverse(char*str)????????????????第一次调用arr[]=abcdef\0
{
int?sz = strlen(str);
char?tmp = *str;???????????????????tmp=a;
*str?= *(str?+ sz - 1);????????????arr[]=fbcdef\0? //理解为在对应地址上做变化,别的地址上的不变
*(str?+ sz - 1) = '\0';???????????arr[]=fbcde\0\0?//理解为在对应地址上做变化,别的地址上的不变
if?(strlen(str?+ 1) >= 2)
reverse(str?+ 1);???????????reverse(str?+ 1);递归一次
?????????????????????????????????传入第二次调用
*(str?+ sz - 1) = tmp;???????????????arr[]=bcdef\0??//理解为在对应地址上做变化,别的地址上的不变
????????????????????????????????????*(str?+ sz - 1) = tmp;?先不执行
void?reverse(char*str)????????????????第2次调用arr[]=bcdef\0??//理解为在对应地址上做变化,别的地址上的不变
{
int?sz = strlen(str);
char?tmp = *str;???????????????????tmp=b; tmp为局部变量在此时和上次的tmp=a;不影响
*str?= *(str?+ sz - 1);????????????arr[]=ecde\0\0??//理解为在对应地址上做变化,别的地址上的不变
*(str?+ sz - 1) = '\0';???????????arr[]=ecd\0\0\0??//理解为在对应地址上做变化,别的地址上的不变
if?(strlen(str?+ 1) >= 2)
reverse(str?+ 1);???????????reverse(str?+ 1);递归二次
?????????????????????????????????传入第三次次调用
*(str?+ sz - 1) = tmp;???????????????arr[]=cd\0\0\0??//理解为在对应地址上做变化,别的地址上的不变
????????????????????????????????????*(str?+ sz - 1) = tmp;?先不执行
void?reverse(char*str)????????????????第3次调用arr[]=cd\0\0\0
{
int?sz = strlen(str);
char?tmp = *str;???????????????????tmp=c; tmp为局部变量在此时和上次的tmp=b;不影响
*str?= *(str?+ sz - 1);????????????arr[]=dd\0\0\0??//理解为在对应地址上做变化,别的地址上的不变
*(str?+ sz - 1) = '\0';???????????arr[]=d\0\0\0\0??//理解为在对应地址上做变化,别的地址上的不变
if?(strlen(str?+ 1) >= 2)???????不满足,不在调用
reverse(str?+ 1);??????????
*(str?+ sz - 1) = tmp;???????????????arr[]=dc\0??//理解为在对应地址上做变化,别的地址上的不变
则 arr[]=fedcba;
void reverse(char*str)
{
int sz = strlen(str);
char tmp = *str;//首字符存入tmp
*str = *(str + sz - 1);//最后面的字符存入数组的第一个位置
*(str + sz - 1) = '\0';//数组最后位置放入\0
if (strlen(str + 1) >= 2)//判断字符长度是否大于等于2
reverse(str + 1);
*(str + sz - 1) = tmp;//将tmp放入最后位置
}
int main()
{
char arr[] = "abcdef";
reverse(arr);
printf("%s", arr);
}
该字符串倒置并非倒置为.gnij ekil i,思路:可以将整个字符串先倒置,然后再将每个单词倒置,
字符串倒置
定义两个指针变量,分别指向该字符串的头和字符串的尾,对两个指针指向的地址做循环判断,是否前面指针指向的地址小于后面指针指向的地址,循环里面交换两个指针所指向的字符,利用一个中间变量,然后前面的指针++;后面的指针减减;
在定义两个指针分别记录每个单词的起始地址和结束地址
char* cur = arr;//记录每个单词结束地址
char* start = arr;//记录每个单词开始地址
start指向字符串数组的头,循环当cur没有指向空格时,cur++;循环结束,此时start指向字母的头,cur指向空格,此时调用
reverse(start, cur - 1);
将这个单词倒置,然后要倒置下一个单词,还是让start指向下一个单词的头,也就是cur指向的下一个字符,cur要加到下一个单词的尾,大循环是到*cur碰到\n;注意最后一个单词的结尾并不是空格,而是\0;
void reverse(char* l, char* r)//倒置函数
{
while (l < r)
{
char tmp = *l;
*l = *r;
*r = tmp;
l++;
r--;
}
}
int main()
{
char arr[100] = { 0 };
gets(arr); //scanf函数读不到空格或者用scanf("%[^\n]s,arr);
int len = strlen(arr);
char* left = arr;
char* right = arr + len - 1;
reverse(left, right); //从这往上是将整个字符串倒置
char* cur = arr; //指向单词结尾的指针
char* start = arr; //指向单词头的指针
while (*cur!='\0') //指向单词结尾的指针不是最后一个单词结尾时循环
{
while (*cur !=' ' && *cur !='\0') //指向每个单词结尾的指针
{
cur++;
}
reverse(start, cur - 1);//倒置一个单词
start = cur + 1;//指向下一个单词的首字母
if(*cur!='\0')cur++;//指向单词结尾的指针移动到下一个空格
}
printf("%s", arr);
}
倒置字符串的核心指针指向字符交换,并且移动指针,结束条件头指针地址小于尾指针,希望帮助到大家