今天听同事说到字符串逆序的问题,所以也就自己写了一下。蛮有意思,
方法一:正常解法
思路
- 采用两个指针,一个指针指向字符串起始位置,一个指针指向字符串结束位置。
- 两个指针向中间移动,数据交换采用经典的临时变量交换法。
//字符串反转
#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;
}
网友评论