#define MAX_WORD 32 #define IsC(c) (((c) >= 'a' && (c) <= 'z') || ((c) >= 'A' && (c) <= 'Z')) // 将一个句子逆置,单词内顺序不变(无除字母和空格外的其他字符) bool ReverseSentance(char *sentance) { if(!sentance) return false; int len = strlen(sentance); char *pStart1 = sentance, *pStart2 = sentance, *pEnd1 = sentance + len - 1, *pEnd2 = sentance + len; char szWordStart[MAX_WORD] = "", szWordEnd[MAX_WORD] = ""; // 初始化为第一个和最后一个单词 int i = 0, j = 0; while(pStart1 <= pEnd1 && IsC(*pStart1)) { i ++; pStart1 ++; } pStart1 ++; while(pStart1 <= pEnd1 && IsC(*pEnd1)) { j ++; pEnd1 --; } pEnd1 --; strncpy(szWordStart, pStart2, i); strncpy(szWordEnd, pEnd2 - j, j); i ++; j ++; while(pStart1 < pEnd2) { int len = strlen(szWordStart); int space = pEnd2 - pEnd1 - 1; if(len + 1 <= space) { pEnd2 -= len; strncpy(pEnd2, szWordStart, len); memset(szWordStart, 0, MAX_WORD); pEnd2 --; *pEnd2 = ' '; j -= len + 1; i = 0; while(pStart1 <= pEnd1 && IsC(*pStart1)) { i ++; pStart1 ++; } strncpy(szWordStart, pStart1 - i, i); i ++; pStart1 ++; } else { len = strlen(szWordEnd); strncpy(pStart2, szWordEnd, len); pStart2 += strlen(szWordEnd); memset(szWordEnd, 0, MAX_WORD); *pStart2 = ' '; pStart2 ++; i -= len + 1; j = 0; while(pStart1 <= pEnd1 && IsC(*pEnd1)) { j ++; pEnd1 --; } strncpy(szWordEnd, pEnd1 + 1, j); j ++; pEnd1 --; } } if((len = strlen(szWordStart)) != 0) { strncpy(pStart2, szWordStart, len); } else { strncpy(pStart2, szWordEnd, strlen(szWordEnd)); } return true; } void main() { char s1[256] = "I am a very good boy"; while(1) { cout << "请输入一个句子(请勿输入标点),按回车结束" << endl; cin.getline(s1, 256, '/n'); ReverseSentance(s1); cout << s1 << endl; } }