不使用中间变量实现字符串反转

  昨天做了一道面试题,题目大概是这样的:现在有字符串“I love China”,需要对该字符串中的单词进行逆序,但是不允许使用第三方变量来保存数据,可以使用辅助指针。
  思路是比较清晰的,但在纸上手写代码还有感觉有点别扭,编译不了啊。。。所以今天有空就画个流程图,再码一下代码,编译调试一下吧。
  思路是这样的:利用两个指针 *head 和 *tail 分别指向字符串的头和尾(不是 ‘\0’),然后交换指针所指向的数据(通过加减运算),接着使 head 和 tail 指针往中间移动,直到所有字符交换完。
  
流程图:

不使用中间变量实现字符串反转_第1张图片

代码:

#include 
#include 

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)”。
  
  好啦,我们来看一下打印结果吧,如下:

不使用中间变量实现字符串反转_第2张图片

你可能感兴趣的:(不使用中间变量实现字符串反转)