字符串倒序出错
下面的字符串倒序程序在VC6.0下运行出错,不知哪位高手指点一下啊
char* strrev5(/*const */char* str,int len)
{
if (len <= 1)
return str;
(*str) ^= (*(str+len-1));
(*(str+len-1)) ^= (*str);
(*str) ^= (*(str+len-1));
return (strrev5(str + 1,len - 2) - 1);
}
void main()
{
char* str = "hello ";
str = strrev5(str,strlen(str));//
printf( "%s\n ",str);
}
[解决办法]
char* strrev5(/*const */char* str,int len)
{
if (len <= 1)
return str;
(*str) ^= (*(str+len-1));
(*(str+len-1)) ^= (*str);
(*str) ^= (*(str+len-1));
return (strrev5(str + 1,len - 2) - 1);
}
void main()
{
char str[] = "hello ";
strrev5(str,strlen(str));//
printf( "%s\n ",str);
}
[解决办法]
str是一个指向常量字符串的指针,不能往指针里写数据。
用字符数组
[解决办法]
void main()
{
char str[] = "hello ";
str2 = strrev5(str,strlen(str));//
printf( "%s\n ",str2);
}
[解决办法]
char* strrev5(/*const */char* str,int len)
{
if (len <= 1)
return str;
(*str) ^= (*(str+len-1));//你这里是交换字符吗,为什么异或
(*(str+len-1)) ^= (*str);
(*str) ^= (*(str+len-1));
}
==================
char* strrev5(/*const */char* str,int len)
{
char temp;
if (len <= 1)
return str;
for(int i=0;i <len/2;++i)
{
temp=str[i];
str[i]=str[len-1-i];
str[len-1-i]=temp;
}
return str;
}
[解决办法]
你这个是递归调用反转字符串吧,我给你一个很容易理解的算法
#include<string>
#include<iostream>
using namespace std;
char *f(char *a)
{
static char *begin=a;
static char *end=a+a.length()-1;
if(a==NULL)
return NULL;
if(begin>end)
return NULL;
char t=*begin;
*begin=*end;
*end=t;
end--;
f(++begin);
return a;
}
int main()
{
string a;
cin>>a;
cout<<f(a);
}
[解决办法]
没有必要用xor操作,这样会降低代码的可读性,更没有必要使用递归,太浪费资源了。。
或许你可以直接使用标准程序库中的reverse来反转字符串:
char str[] = "this is a string";
std::reverse(str, sizeof(str)/sizeof(*str));
如果你非要自己写,那么我建议你查阅一下std::reverse的实现,以便写出更优雅的代码。我也写了一个,看是否合乎你的要求:
char* reverse_string(char* str) {
char* ret = str;
char* last = str;
while (*last != '\0') ++last;
for (; first < last; ++first)
std::iter_swap(first, --last);
return ret;
}
[解决办法]
#include<iostream>
using namespace std;
char* strrev5(char* str,int len)
{
if (len<=1)
return str;
char p=*(str+len-1);
*(str+len-1)=*str;
*str=p;
strrev5(str+1,len-2);
return str;
}
void main()
{
char str[]="hello";
strrev5(str,strlen(str));
printf("%s\n",str);
}
调通了,只要把char *p改为char p[]就可以了,后天我们上课我问问问老师
[解决办法]
I don't know why it is wrong in VC6.0.
But your first work does work under Turboc 2.0,
and I do not think there is any error.
[解决办法]
不接不舒服司机说了
你通过指向常量字符串的指针里修改这部分常量的内容了
改为数组就可以写