//把一个字符串的大写字母放到字符串的后面,各个字符的相对位置不变,不能申请额外的空间。 void MoveSupperToEndWithOrginOrder( char* szSrc , int nSize ) { int nLen = 0; for ( int i= 0; i < nSize; i++ ) { //找到下一个大写字母 if ( isupper(szSrc[i]) ) { //检查大写字母连续的个数 //这段呆码(代码)真呆,重复计算了连续的大写字母个数 nLen = 0; for ( int j= i; j < nSize; j++ ) { if ( isupper(szSrc[j]) ) { nLen++; } else { break; } } //将连续的大写字母和后面的小写字母交换 for ( int j= i + nLen ; j > i; j-- ) { swap(szSrc[j],szSrc[j-1]); } } //判断是否结束 if ( i + nLen == nSize - 1 ) { break; } } } void MoveSupperToEndWithOrginOrder2( char* szSrc , int nSize ) { int nLen = 0; for ( int i= 0; i < nSize; i++ ) { //找到下一个大写字母 if ( isupper(szSrc[i]) ) { nLen++; } else { //将当前小写字母和前面的nLen个连续的大写字母交换 for ( int j= i ; j > i - nLen; j-- ) { swap(szSrc[j],szSrc[j-1]); } } } } void main() { char szSrc[] = {'A','b','c','D','E','F','h','i'}; int nSize = sizeof(szSrc)/sizeof(szSrc[0]); MoveSupperToEndWithOrginOrder2(szSrc,nSize); } //不知道申请的int nLen算不算额外的空间,仅仅用上面的例子进行了测试,或许存在不少bug。