先消除多余空格,再颠倒一整个表,最后颠倒每个单词;
char * reverseWords(char * s){
int i=0,j=1,len=strlen(s);
char t;
"开始排除首尾中间多余的空格"
"开始排除头部空格,找到第一个非空字符,之后全部往前移"
if(s[0]==' '){
while(s[j]==' ')
j++;
while(i+j<=len){
s[i]=s[i+j];
i++;
}
}
"开始排除中间的空格,如果有连续的空格后面的元素全部往前移"
for(i=0;i<len;i++){
if(s[i]!=' ') ;
else{
if(s[i+1]!=' ') ;
else{
while(s[i+1]==' ')
for(j=i+1;j<len;j++)
"注意这边是j<len而不是j<len-1,a[len]永远是'\0'空字符"
s[j]=s[j+1];
}
}
len=strlen(s);
}
"开始排除最后一个空格,因为最后一个空格在之前排除中是死角,无法处理,所以多加一个if语句来判断"
if(s[len-1]==' ') s[len-1]='\0';
"颠倒整个表"
len=strlen(s);
for(i=0;i<=(len-1)/2;i++){"向下取整,所以不用分类奇数偶数";
t=s[i];
s[i]=s[len-1-i];
s[len-1-i]=t;
}
"颠倒每一个单词"
i=0;
int tail=0,head=0,lenth;
while(tail<len){
while(s[tail+1]!=' '&&s[tail+1]!='\0')
tail++;
lenth=tail-head+1;
for(j=head;j<=head+(lenth-1)/2;j++){
t=s[j];
s[j]=s[head+tail-j];
s[head+tail-j]=t;
}
tail=tail+2;
head=tail;
}
return s;
}
总结:
数组的处理要小心边界,然后就是,好好学c++之后在刷题吧哈哈哈。