程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> C言語經過指針和數組完成字符串倒序

C言語經過指針和數組完成字符串倒序

編輯:關於C++

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 */

 自己原創(博客園)

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved