輸入一個字符串,將其逆轉並輸出。eg:s=「abcd」,逆序後變成s=「dcba」。數組
1.原地逆序ide
原地逆序不容許額外分配空間,就是將字符串兩邊的字符逐個交換。spa
(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 之間進行逆序。code
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.普通逆序blog
直接分配一個與原字符串等長的字符數組,而後反向拷貝。遞歸
3.按單詞逆序字符串
給定一個字符串,按單詞將其逆序。eg:「This is a student」,輸出是 「student a is This」。分兩步,第一步,先按單詞逆序,獲得「sihT si a tneduts」,第二步將整個句子逆序,「student a is This」。string
對於第一步,關鍵是如何肯定單詞,這裏以空格爲分界。io
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 }