1.整体思想
输入字符串 I like china.
如何输出 china. like I
1.把大象放冰箱里分几步
1.把字符串整体逆序----------------- .anihc ekil I
2. 然后把每个单词转过来---------------------china. like I
2.分布实现(再将两个大步骤细分)
1.第一步实现
1.把字符串整体逆序----------------- .anihc ekil I
1.步骤一
首先我们初始化一个字符串数组a为空,从屏幕中读取一个字符串放到a中。
现在思考如何将这个字符串整体翻转呢?
将字符串首元素和尾巴翻转,重复这一动作 就可以将整个字符串翻转过来。
我们如何获取字符串尾元素呢?
利用strlen ()函数 读取字符串的长度,再减1.
因为strlen()读到‘\0’,减1就是字符串尾元素。
用strlen()函数要包含他的头文件 <string.h>
#include<stdio.h>
#include<string.h>
int main()
{
char a[]={0};//初始化字符数组
gets(a);//从屏幕获取一个字符串
int sz = strlen(a);//获取字符串的长度
axx(a,a+sz-1);//调用axx实现字符串整体逆序
printf("%s", a);
return 0;
}
gets(a);
只有一个参数。参数类型为 char* 型,即 str 可以是一个字符指针变量名,也可以是一个字符数组名。
gets(a) 函数的功能是从输入缓冲区中读取一个字符串存储到字符指针变量a所指向的内存空间。
2.步骤2
axx函数的实现
void axx(char* right,char* left) { while (right < left) { char a = 0; a = *right; *right = *left; *left = a; right++; left--; } }
1.因为数组名是数组首元素的地址,所以我把a首元素的地址给 right。
等于char*right=a;
2.a是数组首元素的地址,a+sz-1(指针移动),就是数组尾元素的地址给left
等于 char*left= a+sz-1
3.定义一个char a;作为中转站
| a=*right---------right解引用。把right现在指向的地址中的值(首元素)放到中转站a里
| *right=*left--------------把left现在指向的地址中的值(尾元素)放到right中
| *right=a;-----------把中转站(首元素)放到right
这样就实现了首元素和尾元素的翻转
1.如何重复这个操作呢?
需要个循环while
2.如何实现循环呢 ?
right++; 指针加一,指针相后移动一位,现在指针指向的就是字符串第二个元素
left--; 指针减一,指针相前移动一位,现在指针指向的就是字符串倒数第二个元素
这样就可以重复翻转的动作了
3.循环的条件是什么呢?
right<left,指针比较
当right<left,说明中间还有元素需要翻转
当right>=left,说明中间没有元素需要翻转了,退出循环。
2.第二步实现
如何将每个字符串中的每个单词翻转过来呢
将每个字符串中的每个单词翻转过来
char* start = a; while (*start) { char* end = start; while (*end != ' ' && *end != '\0') { end++; } axx(start,end-1); if (*end != '\0') { start = end+1; } else { start = end; } }
1.现在我们要找到每个单词将每个单词翻转过来
1. 把翻转后a首元素的地址给start
2.创建一个循环,找每个单词然后再翻转过来,当start指向‘\0’时说明已经找到字符数组的末尾了,退出循环
3.定义一个指针end,把start的地址给end.
4.找到每个单词,所以我们要在这个大循环里再创建一个循环,
当end指向的是空格说明end之前我们找到一个单词
当end指向‘\0’说明已经找到头了
当*end != ' ' && *end != '\0'说明end没找到,end++;指针移动到下一位判断找没找到。
5.当end指向空格说明end前面是一个单词,我们调用axx(),将start和end中间的单词翻转
6.如果end指向的不是‘\0’说明没有找到头,
start=end+1 end的后一个地址重新设置成首地址,继续找
当end指向‘\0’说明已经找到头了
退出循环
3.系统的总实现代码
#include<stdio.h>
#include<string.h>
void axx(char* right,char* left)
{
while (right < left)
{
char a = 0;
a = *right;
*right = *left;
*left = a;
right++;
left--;
}
}
int main()
{
char a[] = { 0 };
gets(a);
int sz = strlen(a);
axx(a,a+sz-1);
char* start = a;
while (*start)
{
char* end = start;
while (*end != ' ' && *end != '\0')
{
end++;
}
axx(start, end - 1);
if (*end != '\0')
{
start = end + 1;
}
else
{
start = end;
}
}
printf("%s", a);
return 0;
}