题目
给定一句英语,要求你编写程序,将句中所有单词的顺序颠倒输出。
输入格式:
测试输入包含一个测试用例,在一行内给出总长度不超过 80 的字符串。字符串由若干单词和若干空格组成,其中单词是由英文字母(大小写有区分)组成的字符串,单词之间用 1 个空格分开,输入保证句子末尾没有多余的空格。
输出格式:
每个测试用例的输出占一行,输出倒序后的句子。
输入样例:
Hello World Here I Come
输出样例:
Come I Here World Hello
思路
要求是倒着输出单词,而不是所有的字母。
- 可以考虑用字符串数组str[81]来存储这最多80个字符的字符串
- 最后一个元素用来存储空字符’\0’表示字符串的结束
- %s是用来输出字符串的,直到’\0’为止
- 指针的用法
- char *p = str; 或者char str[81];后,p和str都是指针了
- str数组名表示首元素str[0]的地址,因此str+i表示str[i]的地址,同理p+i
- *str[i]表示数组元素str[i]的数值(字符),同理 *p
- 代码具体实现
- 从后往前输出,先找到最后一个空格的指针,从这个指针往后输出最后一个单词(并加个空格)
- 再将这个空格赋值 ‘\0’,往前找空格,重复上述操作,就实现了倒着输出单词
- 具体实现要注意空格的控制,详细见代码
#include <stdio.h>
int main()
{
char str[81];//81是为了多一个填'\0' ,当做字符串结尾
int i=0;//用来记录录入字符数(含空格)
char *p; //定义指针,变化后用来指向数组中的不同元素
while((str[i]=getchar()) != '\n')//getchar()单字符录入
i++;
str[i]='\0';
for(;i>0;i--)//起始条件不用变,此时i已经符合,i>0即可,因为循环结束后可以再输出
{
if(str[i] == ' ')
{
p=str+i;//p代表地址,str是数组首元素地址,i是当前元素序号
//此举在于变更指针p所指变量的地址为当前str[i]的地址,即指向这个代表空格的变量
printf("%s ",p+1);//指针地址+1,即从这个空格之后开始输出字符串,直到遇见'\0'
//注意%s后面有个空格
*p='\0';//*p表示所指变量的值,即把结束标志'\0'赋给原本代表'空格'的变量
//这样做的目的是,下次循环碰见'空格'时,不会重复输出上次输出的字符串
}
}
printf("%s\n",str);//输出字符串数组(直到遇见'\0') ,这是循环最后一个空格的前面的字符串
return 0;
}