C言語經過指針和數組完成字符串倒序。本站提示廣大學習愛好者:(C言語經過指針和數組完成字符串倒序)文章只能為提供參考,不一定能成為您想要的結果。以下是C言語經過指針和數組完成字符串倒序正文
1.數組方式完成 (不必字符串函數)順序如下
1 void ReverseByArray(char * s) 2 { 3 int len = 0; 4 while (s[len] != '\0') 5 len++; 6 int t; 7 for (int i = 0; i < len / 2; i++) 8 { 9 t = s[i]; 10 s[i] = s[len - i - 1]; 11 s[len - i - 1] = t; 12 } 13 }
與數組有關的操作,必需要用到字符串長度len (由於取長度比擬復雜,就不必字符串函數了)
在3-5行 首先用檢測 '\0' 字符判別取字符串長度 用len變量記載
我嘗試過上面這一種代碼 測到的字符串長度比原來大1
int len = 0; while (s[len++] != '\0')
; //空語句
就不運用下面這種辦法
然後是倒序的詳細完成,
罕見的好幾種辦法,網上好多是malloc出來len+1大小的空間 然後逆序放出來
但是我覺得,既然是數組完成,就用一個暫時變量t用前後交流的辦法 直接完成交流(循環只是循環len/2)
另外一個容易呈現問題的是 交流的時分s[len - i - 1] ,為什麼要多減1呢?
2.用指針的辦法 字符串倒序
1 void ReverseByPointer(char * s) 2 { 3 char buf[100]; 4 char *b = buf; 5 char *p = s; 6 while (*p != '\0') 7 *(b++) = *(p++); 8 while(*s != '\0') 9 *(s++) = *(--b); 10 }
用指針 就要突出指針的特點 就不像數組
第一眼看上去,順序似乎特別復雜.
但是 這個順序用到了緩沖區,
假如這個緩沖區大小不夠 ↓如下
在緩沖區足夠的狀況下 ,順序就會正常運轉辣
這裡新建的兩個指針變量b和p都不是多余 起一般名用 都有真實的作用
buf是數組名 值雖然是數組的首地址,但是這個首地址不能停止加減操作,所以新建了個b指針 指向buf
s 是 char * 類型的 可以加減 但是 加到最後(找到\0後) 怎樣倒回來呢?
那麼 我就選擇 定義一個p指針變量 並賦值為 指針s 就是 s和p是一樣的
而且 p向後挪動 找到'\0'後 它的義務就完成了 並不需求回到開端的地位
最後 把buf的內容 -- (倒著)填回 s 指向的字符串就行了
最後就是\0的問題 由於字符串只是倒序 長度沒有變化,所以\0用的還是s原來的\0 不必在末尾添加\0
3.完好的順序和運轉後果
1 #include <stdio.h> 2 3 void ReverseByArray(char * s) 4 { 5 int len = 0; 6 while (s[len] != '\0') 7 len++; 8 int t; 9 for (int i = 0; i < len / 2; i++) 10 { 11 t = s[i]; 12 s[i] = s[len - i - 1]; 13 s[len - i - 1] = t; 14 } 15 } 16 17 void ReverseByPointer(char * s) 18 { 19 char buf[100]; 20 char *b = buf; 21 char *p = s; 22 while (*p != '\0') 23 *(b++) = *(p++); 24 while(*s != '\0') 25 *(s++) = *(--b); 26 } 27 28 int main() 29 { 30 char s[20] = "I Love you 233"; 31 printf("源字符串:%s \n", s); 32 33 ReverseByArray(s); 34 printf("數組方式倒序:%s \n", s); 35 36 ReverseByPointer(s); 37 printf("指針方式倒序:%s \n", s); 38 } 39 40 /* 在VC編譯器的運轉後果 41 源字符串:I Love you 233 42 數組方式倒序:332 uoy evoL I 43 指針方式倒序:I Love you 233 44 請按恣意鍵持續. . . 45 */
自己原創(博客園)