#include <stdio.h> #include <string.h> #include <assert.h> void reverse(char* left, char* right) { assert(left && right); while (left <= right) { int ret = *left; *left = *right; *right = ret; left++; right--; } } int main() { char ch[10001] = { 0 }; int i = 0; while ((ch[i] = getchar()) != '\n') { if ((ch[i] < 'A' || ch[i] > 'Z') && (ch[i] < 'a' || ch[i] > 'z')) { ch[i] = ' '; } i++; } //删除换行符 ch[i] = 0; int sz = strlen(ch) - 1; //先逆置整个字符串 reverse(ch, ch + sz); //再逆置单词 char* pc = ch; while (*pc) { char* start = pc; char* end = pc; while (*end != ' ' && *end != '\0') { end++; } reverse(start, end - 1); if (end != '\0') pc = end + 1; else pc = end; } //将多个空格转换为一个空格进行输出 char* end = ch; char* start = ch; while (*end) { if (*end != ' ') printf("%c", *end++); else { start = end; while (*start == ' ') { start++; } end = start; printf(" "); } } return 0; }