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

  昨天做了一道面试题,题目大概是这样的:现在有字符串“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)”。
  
  好啦,我们来看一下打印结果吧,如下:

这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阿基米东

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值