字符串的倒置例子
字符串倒置可以用递归的方法,也可以用非递归的方法;
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); }
倒置字符串的核心指针指向字符交换,并且移动指针,结束条件头指针地址小于尾指针,希望帮助到大家