一.先上全部代码,再进行逐一分析
过程简单概括为
1.先逆序整个字符串。
2.再逐一逆序单个单词。
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
void reverse(char *left,char *right)
{
while (left < right)
{
char tmp = 0;
tmp = *left;
*left = *right;
*right = tmp;
right--;
left++;
}
}
int main()
{
char arr[100] = { 0 };
gets(arr);
//散步翻转法
//1.先颠倒整个字符串,再颠倒字符。
//获取字符创的首地址和末地址
int sz = strlen(arr);
//这里求出的是字符串的总长度,但是如果要获取正确的下标,必须在长度上-1,因为下标是从0开始的
reverse(arr, arr + sz - 1);
//2.再逐个颠倒字符串
char* st = arr;
while (*st)
{
char* ed = st; //*st是取对应地址的值来使用,st则是取st中存储的地址来使用。
while (*ed != ' ' && *ed !='\0')
{
ed++;
}
reverse(st, ed - 1);
if (*ed == ' ')
st = ed + 1;
else
st = ed;
}
printf("%s", arr);
return 0;
}
利用Strlen功能函数求出字符串的总长度
int sz = strlen(arr);
//这里求出的是字符串的总长度,但是如果要获取正确的下标,必须在长度上-1,因为下标是从0开始的
2.利用自建函数先逆序整个字符串
//void reverse(char *left,char *right)自建函数
reverse(arr, arr + sz - 1);//传址调用
//跳转到函数内部如下
void reverse(char *left,char *right) //两个指针形参变量来接受两个地址。
{
while (left < right) //内存中,地址是由低到高的,字符串的地址一般来说也是由低到高
{ //换成成功后,低地址自增,高地址自减
//直到条件不成立结束循环后,整个字符串即逆序成功
char tmp = 0;
tmp = *left;
*left = *right;
*right = tmp;
//以上三步为 right与left的想互换
//互换成功后,低地址自增,高地址自减。
right--;
left++;
}
}
3.逐一逆序单个字符串。
//2.再逐个颠倒字符串
char* st = arr; //先将字符串的首地址赋给指针变量st
while (*st) //建立逆序循环,只要*st不是'\0',则一直进行逆序到字符串结束,
{ // '\0'为字符串结束标志
char* ed = st;
//*st是取对应地址的值来使用,st则是取st中存储的地址来使用。
//创建一个指针变量 ed 将开始地址赋给ed
while (*ed != ' ' && *ed !='\0')
{ //条件判断为 如果*ed不为空格并且字符串结束标志'\0'
//ed++,直到碰到对应条件 *ed不为空格和字符串结束标志'\0',即停止自增
ed++;
}
//停止自增后,代表ed已经找到单个单词或字符串结束标志,开始进行逆序。
reverse(st, ed - 1);
//如果ed 等于空格 则重置st到空格后开始逆序下一次单词
//如果不是则肯定已经是字符串结束标志,直接结束逆序
if (*ed == ' ')
st = ed + 1;
else
st = ed;
}
printf("%s", arr); //打印整个逆序后的字符串。
完结撒花