本篇文章介紹了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~