PAT (Basic Level) Practice题解 1009 说反话 [C语言实现]

这篇博客介绍了如何使用C语言解决PAT Basic Level的1009题,即反转输入句子中的单词顺序。博主提供了思路分析,包括使用字符串数组存储输入,通过指针寻找单词边界,并从后向前输出单词。代码实现中注意空格的处理,以正确地按逆序输出每个单词。

题目

原题链接

给定一句英语,要求你编写程序,将句中所有单词的顺序颠倒输出。

输入格式:
测试输入包含一个测试用例,在一行内给出总长度不超过 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;
}

欢迎指正

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值