字符串倒序出错

dollarsun 2007-09-28 09:36:06
下面的字符串倒序程序在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);
}
...全文
233 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
dollarsun 2007-10-13
  • 打赏
  • 举报
回复
多谢各位的指点,虽然分数不多。
现在终于搞白了,char* str = "hello"; 这样定义的hello是放在常量存储区,而常量是不能被修改的。
而char str[] = "hello"; 定义的hello是放在栈中的,修改没有问题。

giggham 2007-10-12
  • 打赏
  • 举报
回复
不接不舒服司机说了
你通过指向常量字符串的指针里修改这部分常量的内容了
改为数组就可以写
gfsgmss 2007-10-12
  • 打赏
  • 举报
回复
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.
dollarsun 2007-10-11
  • 打赏
  • 举报
回复
就是搞不懂为什么我那样会出错,很想知道原因
zhaoyue12365 2007-10-10
  • 打赏
  • 举报
回复
#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[]就可以了,后天我们上课我问问问老师
AdriftLeaves 2007-10-10
  • 打赏
  • 举报
回复
没有必要用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;
}
zhaoyue12365 2007-10-10
  • 打赏
  • 举报
回复
你这个是递归调用反转字符串吧,我给你一个很容易理解的算法
#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);
}
nklk 2007-10-10
  • 打赏
  • 举报
回复
Chiyer
dollarsun 2007-10-10
  • 打赏
  • 举报
回复
哪位大侠再指点指点啊
dollarsun 2007-10-04
  • 打赏
  • 举报
回复
可执行这样一句char t = *(str +4);是可行的,晕了~~
dollarsun 2007-10-04
  • 打赏
  • 举报
回复
突然想通了,用char* str 只分配了一个地址空间,(*(str+len-1))是无效的。。。
多谢各位啊!
dollarsun 2007-10-04
  • 打赏
  • 举报
回复
to:黄瓜@YouCanDoIt
用异或就可以不用中间变量了,节省资源~
dollarsun 2007-10-04
  • 打赏
  • 举报
回复
to:不接不舒服斯基
我没有往指针里写数据啊,只是将(*str)和(*(str+len-1))数据交换,没有对地址进行写如啊
0黄瓜0 2007-09-28
  • 打赏
  • 举报
回复
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;
}
CoderPlusPlus 2007-09-28
  • 打赏
  • 举报
回复
void main()
{
char str[] = "hello";
str2 = strrev5(str,strlen(str));//
printf("%s\n",str2);
}
ckt 2007-09-28
  • 打赏
  • 举报
回复
str是一个指向常量字符串的指针,不能往指针里写数据。
用字符数组
星羽 2007-09-28
  • 打赏
  • 举报
回复
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);
}

70,037

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧