PTA 7-32 说反话-加强版

在这里插入图片描述

思路:
读入字符串str,那么用output数组存储每个单词的首字母,及尾字母后一字母在字符串的下标。那么已知这两个数据便可以输出该单词。
考虑到逆序输出的需要,逆序读取字符串。

如字符串”#apple##“(#表示空格),共8个字符
逆序读取
读第1个字符#,不是尾字母后一个也不是首字母,output不变
读第2个字符#,是尾字母后一个,下标6,则output={6}
读第3个字符e,不是尾字母后一个也不是首字母,output不变
.
.
.
读第7个字符e,是首字母,下标1,则output={6,1}
读第8个字符#,不是尾字母后一个也不是首字母,output不变
那么输出str[1-5]便可输出apple
同理对字符串”#ap#le##“,output={6,4,3,1},输出str[4-5],str[1-2]

我对于首字母判断是前有空格,自己不是空格
对尾字母后一字母判断是己为空格,前非空格
这使得首字母的判断对“ap##le#”的a判断失误
尾字母后一字母对不是以空格结尾的字符串"#apple"判断失误
因此在字符串后加上一空格以处理尾字母,对首个字母单独判断
另外,全空格“####”也是特殊情况,特别处理。

#include<stdio.h>
#include <string.h>
int main()
{

	int inum=0,onum=0;
	char input[500001]="\0";
	
	gets(input);
	//末尾连接" "
	inum=strlen(input)+1;
	input[inum-1]=' ';
	input[inum]='\0';
	int output[inum];
	
	int first=0;//指向首个非零字符
	while(input[first]==' ')
	{
		first++;
	}
	
	for(int i=inum-1;i>first;i--)
	{
		if( (input[i]==' '&&input[i-1]!=' ') ||  (input[i]!=' '&&input[i-1]==' ') )//i指向单词末端或i指向单词首端
		{
			output[onum]=i;
			onum++;	
		}	
	}
	output[onum]=first;
	onum++;
	
	//输出
	if(onum==1)//如果输入为空格
		printf("\n");
	else
	{
		int i=0;
		input[output[i]]='\0';
		i++;
		printf("%s",input+output[i]);
		i++;
		while(i<onum)
		{
			input[output[i]]='\0';
			i++;
			printf(" %s",input+output[i]);
			i++;
		}
	}
	return 0;
}
	
	
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值