思路:
读入字符串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;
}