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;
//     }
}