一、字符串整体逆序输出
比如将“I love you!”逆序输出为“!uoy evol I”。
思路很简单,只要把最后一位“!”的地址与“I”的地址进行交换,“u”与第二位的“ ”进行交换.....依次进行交换,到中间位置就停止,即完成字符串逆序。
我们可以通过以下代码编译:
#include<stdio.h>
#include<string.h>
int main()
{
char arr[100];//创建一个字符串型变量
gets(arr);//输入"I love you!"
int len = strlen(arr);//计算出字符串的长度
char* left = arr;//定义一个指针变量*left为arr的首地址
char* right = arr + len-1;//定义*right为arr的末地址
while (left < right)//要求左边left地址要小于右边right地址
{//此处进行首末地址进行交换
char tem = *left;
*left = *right;
*right = tem;
left++;//left往右移动一位
right--;//right往左移动一位
}//只要left不小于right时循环就终止,arr中单个字符就交换位置了
printf("%s", arr);//此时的arr已经完成倒置
}
运行结果如下:
二、语句中单词进行倒置
如“I love you!”进行倒置为“you! love I”。
解决这种倒置的思路为:
1.将整个字符串进行倒置。
2.将倒置后的单个单词再进行一次倒置
简单而言也就是我们只需要进行两次倒置就可以得到结果。
void reverse(char* l, char* r)
{
while (l < r)//字符串交换循环,详见上一个字符串倒置
{
char tmp = *l;
*l = *r;
*r = tmp;
l++;
r--;
}
}
我们先建立一个倒置函数,便于我们的代码简单简洁。
int main()
{
char arr[100] = { 0 };
//输入
gets(arr);
int len = strlen(arr);
//逆序
//1. 逆序整个字符串
char* left = arr;
char* right = arr + len - 1;
reverse(left, right);//进行字符串倒置
//2. 逆序每个单词
char* cur = arr;//创建*cur指针地址,用它在后面进行字符串移动判断
char* start = arr;//*start来记录第一个字符
while (*cur != '\0')//*cur往右移动进行判断,过程中可以把单个单词进行倒置,遇到’\0‘就停止
{
while (*cur != ' ' && *cur != '\0')//如果*cur往右移动时遇到' '或者'\0'就停止
{
cur++;//往右移动一位
}
reverse(start, cur - 1);//可以将这个循环结束前的单词进行倒置
start = cur + 1;//把第二个单词的第一个字符个start
if (*cur != '\0')
cur++;//把第二个单词第一个字符赋给cur
}
printf("%s\n", arr);
return 0;
}
运行结果如下: