给到一串字符“I am a student.”,将其输出为“student. a am I”。
整体思路为先将整个字符串逆序为
‘’.tneduts a ma I"
然后再将每个单词进行逆序转换为
“student. a am I”
那么我们只需先写出将整个字符串逆序的函数就已经将问题解决了大半
void reserve_string(char* start, char* end){while (start < end){char temp = *start;*start = *end;*end = temp;start++;end--;}}
此处代码形参是取到目标字符串的首地址和为地址,然后将两个地址处的字符逐个进行交换。
接下来我们再进行处理单个单词,只需要用上面的代码将每个单词进行逆序就可以,但是要注意空格处,代码如下:
void reserve_all(char* str){char *cur = str;int len = strlen(str);reserve_string(str, str + len - 1);while (*cur){char *start = cur;while ((*cur) != ' ' && (*cur) != '\0'){cur++;}reserve_string(start, cur - 1);while ((*cur) == ' '){cur++;}}}
此处代码用指针cur作为当前地址,初始化取字符串首地址str,在进行整体逆序的时候的尾地址为str+len+1(首地址加往后长度的地址减一)。
在进行单个单词逆序的时候在在空格前和终止符前停止地址前移,然后以此进行单个单词调换。
并且需要注意在单个单词调换时的尾地址cur需要-1,因为在上面的while循环中在检测出空格或终止字符后cur还会+1.
接下来只需要执行就可以得到逆序结果了:
int main(){char string[] = "l am a student.";reserve_all(string);printf("%s\n", string);system("pause");return 0;}