先翻转整个字符串,再翻转每个单词。
#include <string.h>
void swap(char *left, char *right){
char tmp = *left;
*left = *right;
*right = tmp;
}
void reverse(char *str, int begin, int end){
while(begin < end){
swap(&str[begin], &str[end]);
++begin;
--end;
}
}
void reverseSentence(char *sentence){
int len = strlen(sentence);
int wordBegin = 0;
int wordEnd = 0;
if(sentence == NULL) return;
reverse(sentence, 0, len - 1);
while(sentence[wordBegin] == ' '){
++wordBegin;
++wordEnd;
}
while(sentence[wordEnd] != '\0'){
while(sentence[wordEnd] != ' ' && sentence[wordEnd] != '\0'){
++wordEnd;
}
reverse(sentence, wordBegin, wordEnd - 1);
if(sentence[wordEnd] == '\0') break;
wordBegin = wordEnd;
while(sentence[wordBegin] == ' '){
++wordBegin;
++wordEnd;
}
}
}
int main(){
char *cases[] = {"hello world!!!", " hello world...", " Hello world???", "hello", " ", " ", "hi I am lic."};
char **str;
int strIndex = 0;
int letterIndex = 0;
int casesNum = sizeof(cases) / sizeof(char*);
str = (char**)malloc(sizeof(cases));
for(strIndex = 0; strIndex < casesNum; ++strIndex){
str[strIndex] = (char*)malloc(1 + strlen(cases[strIndex]));
for (letterIndex = 0; letterIndex < strlen(cases[strIndex]); ++letterIndex)
{
str[strIndex][letterIndex] = cases[strIndex][letterIndex];
}
str[strIndex][letterIndex] = '\0';
}
for(strIndex = 0; strIndex < casesNum; ++strIndex){
printf("before: %s\n", str[strIndex]);
reverseSentence(str[strIndex]);
printf("after : %s\n", str[strIndex]);
}
for(strIndex = 0; strIndex < casesNum; ++strIndex){
free(str[strIndex]);
}
free(str);
return 0;
}