所有单词都要翻转,那咱就一个个来翻嘛,每次找到一个单词的左右边界,然后用左右互换来翻转单词即可。
char* reverseWord(char* str ) { int left = 0, right = 0, n = strlen(str); //假设第一个单词的左右边界下标都是0,即起始处 while(right < n){ //右边界最大也就是n-1 left = right; //每次找单词时都假设左边界和右边界一样,然后再去找右边界,即找空格 while(right < n && str[right] != ' ') //只要不是空格就继续往后走 right++; //在遇到空格时停下,right为空格的下标 int i = left, j = right - 1; //待翻转单词的左右边界 while(i < j){ //用左右依次交换来翻转单词 int tmp = str[i]; str[i] = str[j]; str[j] = tmp; i++; j--; //左下标往右走,右下标往左走 } while(str[right] == ' ') right++; //翻转完一个单词,开始找下一个单词,right继续后移,找到第一个不是空格的即为下一个单词的起始处 } return str; }或者分开写,反转函数单独放一边更清楚
char* reverse(char* str, int left, int right){ //反转函数 int i = left, j = right; while(i < j){ int tmp = str[i]; str[i] = str[j]; str[j] = tmp; i++; j--; } return str; } char* reverseWord(char* str ) { int n = strlen(str); int i = 0, j = 0; while(j < n){ while(str[i] == ' ') // i++; //遇到非空的第一个即为单词左边界,i停在左边界处 j = i; //j从左边界开始遍历,寻找右边界 while(j < n && str[j] != ' ') j++; //j遇到第一个空格表示一个单词已结束,右边界为j-1 reverse(str, i, j-1); i = j; //i从j开始继续寻找下一个单词的左边界 } return str; }