首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

字符串倒序出错解决思路

2012-02-29 
字符串倒序出错下面的字符串倒序程序在VC6.0下运行出错,不知哪位高手指点一下啊char*strrev5(/*const*/cha

字符串倒序出错
下面的字符串倒序程序在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.
[解决办法]
不接不舒服司机说了
你通过指向常量字符串的指针里修改这部分常量的内容了
改为数组就可以写

热点排行