1. 字符串逆序问题

2019-05-10  本文已影响0人  郑行_aover

今天听同事说到字符串逆序的问题,所以也就自己写了一下。蛮有意思,

方法一:正常解法

思路

  • 采用两个指针,一个指针指向字符串起始位置,一个指针指向字符串结束位置。
  • 两个指针向中间移动,数据交换采用经典的临时变量交换法。
//字符串反转
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <assert.h>
char* inverse(char* str)
{
    char*   p1 = str;
    char*   p2 = &str[strlen(str)-1];;
    char    t;
    int     len = strlen(str);
    assert(str);
    while(p1 != p2)
    {
            printf("======[%c]==[%c]=====\n",*p1,*p2 );
            t = *p2;
            *p2 = *p1;
            *p1 = t;
            p1++;
            p2--;
    }
    return str;
}


void main()
{
    #define cmd "hello world"
    char* tmp = NULL;
    char* test = malloc(strlen(cmd));
    memcpy(test,cmd,strlen(cmd));
    tmp = inverse(test);
    free(test);
    printf("%s\n",tmp );
}

需要注意的地方:

tmp = inverse(test); 

test不能为字符串常量,如果写成如下形式,则会造成 程序crash掉。

char* test = "hello world";
tmp = inverse(test);

方法二: 递归栈解法

思路:

递归栈解法,是一种比较巧妙的解法,不停的入栈,直到字符串结束,在出栈的过程中,将栈上的数据存储到变量里。

#include <assert.h>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
void inverse_stack(char *str1,char *buf)
{
    assert((str1!=NULL) && (buf != NULL));
    if (*str1 == '\0')  //递归结束的正常条件
        return;
    inverse_stack(str1 + 1,buf);
    strncat(buf, str1, 1);
}
int  main(void)
{
    char test[] = "hello stack";   //buf[] 会在张栈上对全局区的字符串拷贝。
    char result[128] = {0};
    inverse_stack(test,result);
    printf("===%s====\r\n", result);
    return 0;
}
上一篇 下一篇

猜你喜欢

热点阅读