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