字符串倒序

rainbow_free 2009-06-03 10:33:29
char* revert(char* str)
{
int sLength = strlen(str);
char c;


for(int i=0;i<sLength/2; i++)
{
c = *(str+i);
*(str+i) = *(str+sLength-i-1);//Access Violation
*(str+sLength-i-1) = c;
}

return str;
}

帮忙分析一下原因!
...全文
272 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
yyyapple 2009-06-03
  • 打赏
  • 举报
回复
char* revert(char* str) // 问题1, str不能是只读的,比如char *ss = "sdfsfdsfd";
{
int sLength = strlen(str); // 问题2,str必须以"\0"结尾
char c;

for(int i=0;i<sLength/2; i++)
{
c = *(str+i);
*(str+i) = *(str+sLength-i-1);//Access Violation
*(str+sLength-i-1) = c;
}

return str;
}

// 修改后的

char* revert(char* str, int nlen)
{
// 判断字符是否可读可写,如果是vc可以用下面的函数
if (nLen >1 && AfxIsValidAddress(str, sizeof(char) * nLen))
{
char *start = str, *end = str + nLen-1;
char c;

// 交换数据
for (; start < end; start++, end--)
{
c = *start;
*start = *end;
*end = c;
}
}

return str;
}
beackoom 2009-06-03
  • 打赏
  • 举报
回复
char* str = "abcdefghijklmn";
这个好像问题挺大的。str 只是一个指针,没有对应内存空间
majun01 2009-06-03
  • 打赏
  • 举报
回复
char* str = "abcdefghijklmn";这时str指向的是静态字符串数组,其内容是不能够被改变的,所以报错。
codecola 2009-06-03
  • 打赏
  • 举报
回复
同意
[Quote=引用 5 楼 supermegaboy 的回复:]
很可能楼主调用revert的时候传入的是一个字符串常量!!

如果你是这样使用的:

char * p = "kljsdkfjdkf";
.....
revert(p);


应该改为:

char p[] = "sdljflkdsjfkjdf";
.....
revert(p);
[/Quote]
飞天御剑流 2009-06-03
  • 打赏
  • 举报
回复
哈哈,果然如此!!

char* str = "abcdefghijklmn"; //改为char str[] = "abcdefghijklmn";


字符串常量不允许更改。

w0911h 2009-06-03
  • 打赏
  • 举报
回复
你main里定义的字符串是常量字符串,不可改变,你做赋值操作当然会错,改成char str[] = "";就可以了
[Quote=引用 3 楼 rainbow_free 的回复:]
C/C++ codechar* revert(char* str)
{
int sLength = strlen(str);
char c;

for(int i=0;i<sLength/2; i++)
{
c = *(str+i);
*(str+i) = *(str+sLength-i-1);
*(str+sLength-i-1) = c;
}

return str;
}

int main()
{
char* str = "abcdefghijklmn";
str = revert(str);
cout<<str<<endl;

system("Pause")…
[/Quote]
grellen 2009-06-03
  • 打赏
  • 举报
回复
#include<iostream>
using namespace std;

char* revert(char* str)
{
int sLength = strlen(str);
char c;


for(int i=0;i<sLength/2; i++)
{
c = *(str+i);
*(str+i) = *(str+sLength-i-1);//Access Violation
*(str+sLength-i-1) = c;
}

return str;
}

int main()
{
char s[] = "hello";
cout<<revert(s);
return 0;
}


没错啊
飞天御剑流 2009-06-03
  • 打赏
  • 举报
回复
很可能楼主调用revert的时候传入的是一个字符串常量!!

如果你是这样使用的:

char * p = "kljsdkfjdkf";
.....
revert(p);


应该改为:

char p[] = "sdljflkdsjfkjdf";
.....
revert(p);
K_s_G 2009-06-03
  • 打赏
  • 举报
回复
有问题吗?
rainbow_free 2009-06-03
  • 打赏
  • 举报
回复
char* revert(char* str)
{
int sLength = strlen(str);
char c;

for(int i=0;i<sLength/2; i++)
{
c = *(str+i);
*(str+i) = *(str+sLength-i-1);
*(str+sLength-i-1) = c;
}

return str;
}

int main()
{
char* str = "abcdefghijklmn";
str = revert(str);
cout<<str<<endl;

system("Pause");
return 0;
}

全部代码!
grellen 2009-06-03
  • 打赏
  • 举报
回复
简单交换而已啊,第一个字符和最后一个交换,第二个和倒数第二个交换.....
w0911h 2009-06-03
  • 打赏
  • 举报
回复
看起来没有越界,你传入的参数是怎么定义的,把主函数也贴出来吧

65,210

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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