昨天做了一道面试题,题目大概是这样的:现在有字符串“I love China”,需要对该字符串中的单词进行逆序,但是不允许使用第三方变量来保存数据,可以使用辅助指针。
思路是比较清晰的,但在纸上手写代码还有感觉有点别扭,编译不了啊。。。所以今天有空就画个流程图,再码一下代码,编译调试一下吧。
思路是这样的:利用两个指针 *head 和 *tail 分别指向字符串的头和尾(不是 ‘\0’),然后交换指针所指向的数据(通过加减运算),接着使 head 和 tail 指针往中间移动,直到所有字符交换完。
流程图:
代码:
#include <stdio.h>
#include <string.h>
int main(void)
{
char testStr[] = "I love China";
int len = strlen(testStr);
char *head = testStr;
char *tail = &testStr[len -1];
printf("%s\n", testStr); //before
while(head != tail && head < tail)
{
*head = *head + *tail;
*tail = *head - *tail;
*head = *head - *tail;
head++;
tail--;
printf("%s\n", testStr); //reversing
}
printf("%s\n", testStr); //after
return 0;
}
需要注意的是,在这里字符串定义为字符数组变量,即:
char testStr[] = "I love China";
如果定义成:
char *testStr = "I love China";
则表示 testStr 指针指向一个字符串常量,这时候如果通过 head 和 tail 指针去操作该常量,就会出现“Segmentation fault (core dumped)”。
好啦,我们来看一下打印结果吧,如下: