PAT 7-1 说反话-加强版 (20 分) C语言

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

输入格式:

测试输入包含一个测试用例,在一行内给出总长度不超过500 000的字符串。字符串由若干单词和若干空格组成,其中单词是由英文字母(大小写有区分)组成的字符串,单词之间用若干个空格分开。

输出格式:

每个测试用例的输出占一行,输出倒序后的句子,并且保证单词间只有1个空格。

输入样例:

Hello World Here I Come

输出样例:

Come I Here World Hello

思路

1、自定义两个数组

  • 数组1用于fgets()函数读取从键盘输入的字符串str (fgets()函数能够读取回车,需处理)
  • 数组2用于存放数组1得到的字符串str压缩空格后的字符串string (此时有两种情况,一是字符串string开头有一个空格,二是字符串string开头没有空格)

2、倒序输出字符串

  • 从后到前利用for循环的递减遍历数组,遇到空格向后输出一个单词+空格(注意不要输出回车符和多余的空格!)
  • 分情况输出最后一个单词

注意

一开始报错格式错误,百度半天发现有可能是空格字符的原因,在自己的编译器上跑的时候是看不出来空格有几个的。可以将空格替换成其他字符来检验结果。

代码

#include <stdio.h>

int main(void)
{
	char str[500005] = {0}, string[500005] = {0};
	int i = 0, flag = 0, j, k; 
	
	//得到字符串
	fgets(str, 500005, stdin);
	
	//字符串压缩空格处理,会有两种可能
	for (; str[i] != '\0';)
	{
		if (str[i] != ' ')
		{
			string[flag] = str[i];
			flag++;
			i++;
		}
		else
		{
			if (str[i + 1] != ' ' && str[i + 2] != '\0')
			{
				string[flag] = str[i];
				flag++;
				i++;
			}
			else
			{
				i++;
			}
		}
	}

	//倒序输出字符串
	for (j = flag; j >= 1; j--)
	{
		if (string[j] == ' ')
		{
			k = j + 1;
				
			do
			{
				printf("%c", string[k]);
				k++;
			} while (string[k] != '\0' && string[k] != ' ' && k != flag - 1); //flag - 1是为了避免输出回车符
			printf(" ");
		}
	}

	//两种情况下,输出最后一个单词
	if (string[0] != ' ')
	{
		for (j = 0; string[j] != ' '; j++)
		{
			printf("%c", string[j]);
		}
	}
	
	if (string[0] == ' ')
	{
		for (j = 1; string[j] != ' '; j++)
		{
			printf("%c", string[j]);
		}
	}
	
	return 0;
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值