输入一个字符串,将其逆转并输出。eg:s=“abcd”,逆序后变成s=“dcba”。
1.原地逆序
原地逆序不允许额外分配空间,就是将字符串两边的字符逐个交换。
(1)设置两个指针,分别指向字符串的头部和尾部,然后交换两个指针所指的字符,并向中间移动,直到交叉。(这个方法最普遍)
1 #include <stdio.h> 2 3 char * reverse_str(char *str) 4 { 5 char *p,*q; 6 p=str; 7 q=str; 8 while(*q) 9 q++; 10 q--; 11 while(p<=q) 12 { 13 char a=*p; 14 *p++=*q; 15 *q--=a; 16 17 } 18 return str; 19 } 20 21 int main() 22 { 23 // char string[]="abcdefg"; 24 char string[128]; 25 scanf("%s",string); 26 printf("now: %s\n",reverse_str(string)); 27 return 0; 28 }
(2)递归,调用方法 reverse_str(str,0,strlen(str)-1),对字符串 str 在区间 left 和 right 之间进行逆序。
1 char *reverse_str(char *str,int left,int right) 2 { 3 4 if(left>=right) 5 return str; 6 7 char t=str[left]; 8 str[left]=str[right]; 9 str[right]=t; 10 return reverse_str(str,left+1,right-1); 11 12 }
2.普通逆序
直接分配一个与原字符串等长的字符数组,然后反向拷贝。
3.按单词逆序
给定一个字符串,按单词将其逆序。eg:“This is a student”,输出是 “student a is This”。分两步,第一步,先按单词逆序,得到“sihT si a tneduts”,第二步将整个句子逆序,“student a is This”。
对于第一步,关键是如何确定单词,这里以空格为分界。
1 void reverse_str(char *p,char *q) 2 { 3 while(p<q) 4 { 5 char t=*p; 6 *p++=*q; 7 *q--=t; 8 } 9 10 } 11 char *reverse_sen(char *sen) 12 { 13 char *p=sen; 14 char *q=sen; 15 while(*p!='\0') 16 { 17 if(*p==' ') 18 { 19 reverse_str(q,p-1); 20 p++; 21 q=p; 22 } 23 else 24 p++; 25 } 26 reverse_str(q,p-1); 27 reverse_str(sen,p-1); 28 return sen; 29 } 30 int main() 31 { 32 char str[]="This is a student"; 33 // char string[128]; 34 // scanf("%s",string); 35 printf("now: %s\n",reverse_sen(str)); 36 return 0; 37 }
4.逆序打印
用递归的方式完成递归打印
1 void reverse_print(char *str) 2 { 3 if(*(str+1)!='\0') 4 reverse_print(str+1); 5 printf("%c",*str); 6 }