歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

C語言通過指針和數組實現字符串倒序

關於C語言通過指針和數組實現字符串倒序的一篇文章,希望對大家有所幫助。

1.數組方式實現  (不用字符串函數)程序如下

void ReverseByArray(char * s)
{
    int len = 0;
    while (s[len] != '\0')
        len++;
    int t;
    for (int i = 0; i < len / 2; i++)
    {
        t = s[i];
        s[i] = s[len - i - 1];
        s[len - i - 1] = t;
    }
}

與數組有關的操作,必須要用到字符串長度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.用指針的方法 字符串倒序

void ReverseByPointer(char * s)
{
    char buf[100];
    char *b = buf;
    char *p = s;
    while (*p != '\0')
        *(b++) = *(p++);
    while(*s != '\0')
        *(s++) = *(--b);
}

用指針 就要突出指針的特點 就不像數組

第一眼看上去,程序似乎特別簡單.

但是 這個程序用到了緩沖區,

如果這個緩沖區大小不夠  ↓如下

在緩沖區足夠的情況下 ,程序就會正常運行辣

這裡新建的兩個指針變量b和p都不是多余 起個別名用 都有實在的作用

buf是數組名 值雖然是數組的首地址,但是這個首地址不能進行加減操作,所以新建了個b指針 指向buf

s 是 char * 類型的 可以加減 但是 加到最後(找到\0後) 怎麼倒回來呢?

那麼  我就選擇 定義一個p指針變量 並賦值為 指針s  就是 s和p是一樣的

而且 p向後移動 找到'\0'後 它的任務就完成了  並不需要回到開始的位置

最後 把buf的內容 -- (倒著)填回 s 指向的字符串就行了

最後就是\0的問題  因為字符串只是倒序 長度沒有變化,所以\0用的還是s原來的\0 不用在末尾添加\0

3.完整的程序和運行結果

#include <stdio.h>

void ReverseByArray(char * s)
{
    int len = 0;
    while (s[len] != '\0')
        len++;
    int t;
    for (int i = 0; i < len / 2; i++)
    {
        t = s[i];
        s[i] = s[len - i - 1];
        s[len - i - 1] = t;
    }
}

void ReverseByPointer(char * s)
{
    char buf[100];
    char *b = buf;
    char *p = s;
    while (*p != '\0')
        *(b++) = *(p++);
    while(*s != '\0')
        *(s++) = *(--b);
}

int main()
{
    char s[20] = "I Love you 233";
    printf("源字符串:%s \n", s);

    ReverseByArray(s);
    printf("數組方式倒序:%s \n", s);

    ReverseByPointer(s);
    printf("指針方式倒序:%s \n", s);
}

/*  在VC編譯器的運行結果
源字符串:I Love you 233
數組方式倒序:332 uoy evoL I
指針方式倒序:I Love you 233
請按任意鍵繼續. . .
*/

Copyright © Linux教程網 All Rights Reserved