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