【題解】什麼?翻轉字符串還能用這個姿勢做?

本篇文章介紹了4種翻轉字符串的方法:

  • 前兩種是通過修改操作字符串來達到翻轉的目的;
  • 而後兩種則是通過修改輸出方式來達到翻轉的目的。

題目要求:
用戶輸入一串字符串,程序返回一個反序的字符串。

示例:

用戶輸入:asdfghjkl
程序輸出:lkjhgfdsa

方法1:通過異或^=

#include <stdio.h>
#include <string.h>

void overturn_string(char str[]);

int main(void){
    char str[40];   //創建一個空字符串數組

    gets(str);  //獲取字符串

    overturn_string(str);   //調用函數
}

void overturn_string(char str[]){
    //初始化各變量
    int length = 0;
    length = strlen(str);   //獲取字符串的長度
    int i = 0;

    for(i = 0; i < length / 2; i++){
        //length / 2可以提高交換效率
        //採用異或^= 來處理字符串
        str[i] ^= str[length - i - 1];
        str[length - i - 1] ^= str[i];
        str[i] ^= str[length - i - 1];
    }
    //輸出字符串
    puts(str);
}

爲什麼^= 能翻轉字符串?
首先獲得字符的ASCII碼錶的十進制,再轉換成二進制。通過異或來處理得出翻轉的二進制,再反過來執行一次步驟轉化回字符。

方法2:通過指針

#include <stdio.h>
#include <string.h>

int inverse(char *str);

int main(void){
    char str[40];   //創建一個空的字符串

    gets(str);      //獲取用戶輸入

    inverse(str);   //調用函數
}

int inverse(char *str){
    int length = strlen(str);   //獲取字符串長度
    //初始化變量,創建兩個字符串指針
    char *p1;
    char *p2;

    p1 = str;   //指向字符串第一個字符的地址
    p2 = str + (length - 1);    //指向字符串最後一個字符的地址

    while(p1 < p2){ //如果p1 和p2 的地址重合或p2 的地址小於p1 的地址時就會退出循環
        char c = *p1;   //創建一個char 類型的變量來存儲*p1 的值
        *p1 = *p2;      //*p1 獲取*p2 的值
        *p2 = c;        //*p2 獲取臨時存儲在變量c 中的*p1 的值
        ++p1;           //將p1 指向的地址向後移動一位
        --p2;           //將p2 指向的地址向前移動一位
    }

    puts(str);  //輸出交換後的字符串
}

在這裏插入圖片描述


如果覺得有幫助到你的話,就幫忙點個贊 贊 贊吧!!


方法3:通過遞歸

#include <stdio.h>
#include <string.h>

void overturn_string(char *str);

int main(void){
    char str[40];   //創建一個空字符串數組

    gets(str);  //獲取字符串

    overturn_string(str);   //調用函數
}

void overturn_string(char *str){
    if(*str != NULL || *str != '\0'){   //遞歸的結束條件
        overturn_string(str + 1);       //參數指向的地址往下移動一位
    }

    --str;  //因爲遞歸*str 指向的是空字符,所以要將指向的地址前移一位

    printf("%c", *str);     //遞歸的函數開始從尾到頭輸出
}

方法4:通過字符串的長度

#include <stdio.h>
#include <string.h>

int main(void){
    char str[40];   //創建一個空字符串數組

    gets(str);  //獲取字符串

    int length = strlen(str);   //求出字符串的長度

    //直接獲取字符串的長度後,從尾開始往頭輸出
    for(int i = length - 1; i >= 0; i--){
        printf("%c", str[i]);
    }

    return 0;
}

文章到這裏就結束了,期待我們下次再見~
end~


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章