1.使用c_pre标记前一次是否检测到了非字母,若前一次不是非字母,则输出,否则不输出
2.需要注意的是 对于 || 和&&连用时,尽量加上括号,避免编译器给出一些没必要的错误警报
#include<stdio.h>
#include<string.h>
int main(){
char s[10002];
// method 1
fgets(s,sizeof(s),stdin);
int len = strlen(s)-1;
char pre = '0';
for(int i=len-1;i>=0;i--){
if(!(('a'<=s[i]&&s[i]<='z')||('A'<=s[i]&&s[i]<='Z'))){ // 非字母
if(pre!=' '){
for(int j=i+1;j<len;j++)
{
if(('a'<=s[j]&&s[j]<='z')||('A'<=s[j]&&s[j]<='Z'))
printf("%c",s[j]);
else
break;
}
printf(" ");
}
pre=' '; // 用空格标记
}
else
pre = s[i];
}
for(int j=0;j<len;j++)
{
if('a'<=s[j]&&s[j]<='z'||'A'<=s[j]&&s[j]<='Z')
printf("%c",s[j]);
else
break;
}
// method 2 输入时就进行处理
// char c;
// char pre='0';
// int k=0;
// while((c=getchar())!='\n'){
// if(!(('a'<=c&&c<='z')||('A'<=c&&c<='Z')) && pre!=' '){
// s[k++] = ' ';
// pre = ' ';
// }
// else if(('a'<=c&&c<='z')||('A'<=c&&c<='Z')){
// s[k++] = c;
// pre = c;
// }
// }
// int len = strlen(s);
// for(int i=len-1;i>=0;i--){
// if(s[i]==' '){
// for(int j=i+1;j<len;j++){
// if(s[j]!=' ')
// printf("%c",s[j]);
// else
// break;
// }
// printf(" ");
// }
// }
// for(int j=0;j<len;j++){
// if(s[j]!=' ')
// printf("%c",s[j]);
// else
// break;
// }
}