#include<stdlib.h> #include<string.h> #include<stdio.h> #include <ctype.h> int inverse(char *str1, char *str2) //字符串反转函数 { int length = strlen(str1); char *tmp = str1; char *p1 = tmp; char *p2 = tmp + length - 1; while (p1 < p2) { char c = *p1; *p1 = *p2; *p2 = c; ++p1; --p2; } *str2 = tmp; return 0; } void main() { char buf[] = "abcdefg"; char buf2[] = { 0 }; inverse(buf, buf2); printf("buf2:%s \n", buf2); printf("hello...\n"); system("pause"); return; }
主要的逻辑是对的,如下的是能出来的,str2指向的地址和str1是同一个缓冲
int inverse(char *str1, char **str2) //字符串反转函数
{
int length = strlen(str1);
char *p1 = str1;
char *p2 = str1 + length - 1;
while (p1 < p2)
{
char c = *p1;
*p1 = *p2;
*p2 = c;
++p1;
--p2;
}
*str2 = str1;
return 0;
}
int _tmain(int argc, _TCHAR* argv[])
{
char buf[] = "abcdefg";
char *buf2;
inverse(buf, &buf2);
printf("buf:%s \n", buf);
printf("buf2:%s \n", buf2);
因为你的字符串不是unico编码的.应该utf-8的.一个汉字占的字节和英文不一样.
比较简单的法子是先转为unico这样就都是2字节了.
归根倒地要根据当前字符串的编码格式区分一个字符占几个字节.然后整个字符移动.你这样是字节移动就破坏了字符
int inverse(char *str1) { int length ; char *p1 ; char *p2 ; if (str1 == NULL) { return -1; } length = strlen(str1); p1 = str1; p2 = str1 + length - 1; while (p1 < p2) { char c = *p1; *p1 = *p2; *p2 = c; ++p1; --p2; } return 0; }
这样写就没有问题。。
主要是下面这句出问题
*str2 = tmp;
我不知道为什么?