字符串倒转的问题?

sbgphl 2008-09-15 07:07:14
不用库函数、不用数组

例如
char * str = "asdf";
reverse_string(str);
printf("%s \n",str);
输出 fdsa
基本思路是,更改指针指向的数据
void reverse_string(char *str){
char *last_char;

for (last_char = str; *last_char != '\0';last_char++);

for (;*last_char != *str; *last_char--){
*str++ = *last_char;
}
*str++ = *last_char;
}
但是 *str++ = *last_char; 这句无法运行? 不知道问题处在那里了高手上来帮我一下。

...全文
364 16 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
_石头_ 2008-09-16
  • 打赏
  • 举报
回复

#include <stdio.h>
void reverse_string(char *str)
{
char temp, *pt=str;
while(*pt)
pt++;
while(--pt>str)
{
temp=*str;
*str++=*pt;
*pt=temp;
}
}
void main()
{
char str[]="abcdefghijklmn";
reverse_string(str);
printf("%s\n",str);
}
EvilKnight 2008-09-16
  • 打赏
  • 举报
回复
哦,不好意思,看错了,我看成复制到一个新的数组里了,sorry!
EvilKnight 2008-09-16
  • 打赏
  • 举报
回复
字符串是以'\0'结尾的,转完之后,你们有加上去吗?
hjk_thinking 2008-09-15
  • 打赏
  • 举报
回复

同意
5 6 楼的
gezichong 2008-09-15
  • 打赏
  • 举报
回复
TO:

for (;*last_char != *str; *last_char--){
*str++ = *last_char;
}

我认为这个FOR循环是有问题的。如果输入参数为"aaaabbbaa"呢?
也就是有重复字符的时候,应该不可能reverse吧???因为
*last_char与*str都是取具体的字符值,而不是地址。。。。

for (;last_char != str; *last_char--){
*str++ = *last_char;
}
就这样,下面的一句也不要了。
sbgphl 2008-09-15
  • 打赏
  • 举报
回复
这个问题是C和指针一书 第六章 习题3
这是原书的答案
void
reverse_string( char *str )
{
char *last_char;

/*
** Set last_char to point to the last character in the
** string.
*/
for( last_char = str; *last_char != '\0'; last_char++ )
;

last_char--;

/*
** Interchange the characters that str and last_char point
** to, advance str and move last_char back one, and keep
** doing this until the two pointers meet or cross.
*/
while( str < last_char ){
char temp;

temp = *str;
*str++ = *last_char;
*last_char-- = temp;
}
}
问题的关键 是
2、char *str = "somechar..."之后str指向的是一个const char类型的常量存储区,是无法在更改的,也就是说,对于*str的值是无法再更改了,
对于*str = *last_char是无法执行的。。。若要修改str,必须初始化赋值时为一个数组,而不是指针。。

在用数组初始化后程序没有问题
int main(int argc, char** argv) {
// char * str = "asdf";
char str[] = "asdf";
printf("%s \n",str);
reverse_string(str);
printf("%s \n",str);
return (EXIT_SUCCESS);
}
lovewwy 2008-09-15
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 zmvictorcruse 的回复:]
向两位纠正几个严重错误:
1、没有编译过的程序最好编译了再来说。
2、char *str = "somechar..."之后str指向的是一个const char类型的常量存储区,是无法在更改的,也就是说,对于*str的值是无法再更改了,
对于*str = *last_char是无法执行的。。。若要修改str,必须初始化赋值时为一个数组,而不是指针。。
3、两个for中间应该加个last_char--;
[/Quote]
学习了。
wangdeqie 2008-09-15
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 sbgphl 的回复:]
我用的是GCC
[/Quote]


//那就这样
#include <iostream>
using namespace std;

char* reverse_string(char *str)
{
char temp;
int i=0,j=0;
while (str[++i])
;
i=i-1;
while (j<i)
{
temp=str[i];
str[i]=str[j];
str[j]=temp;
++j;
--i;
}
return str;

}

int main()
{
char str[5] = "asdf";
printf("%s \n",reverse_string(str));
system("pause");
return 0;
}

sbgphl 2008-09-15
  • 打赏
  • 举报
回复
我用的是GCC
yangkunhenry 2008-09-15
  • 打赏
  • 举报
回复

#include<iostream>
using namespace std;
void reverse_string(char *str)
{
int i=0;
char *last_char;
char *flag;
char temp;
for (last_char = str; *last_char != '\0';last_char++);
flag=last_char--;
for (;i<(flag-str)/2;last_char--,i++)
{
temp=str[i];
str[i]= *last_char;
*last_char=temp;
}
}
int main()
{
char str[]="wuzhengwen is a dog";
reverse_string(str);
cout<<str<<endl;
return 0;
}

改了下lz的代码,问题不少哈^
只说下这个*last_char != *str; last_char中可能正好有和*str一样的字符呀
cattycat 2008-09-15
  • 打赏
  • 举报
回复
常量字符串不能修改,所以不能赋值操作,*str++ = *last_char;不能这么操作。
还有指针操作的是同一块区域,即使不是常量区,也会覆盖部分字符串。
你还是创建一个字符数组,从第一个末尾逐个拷贝到数组中。
zmvictorcruse 2008-09-15
  • 打赏
  • 举报
回复
向两位纠正几个严重错误:
1、没有编译过的程序最好编译了再来说。
2、char *str = "somechar..."之后str指向的是一个const char类型的常量存储区,是无法在更改的,也就是说,对于*str的值是无法再更改了,
对于*str = *last_char是无法执行的。。。若要修改str,必须初始化赋值时为一个数组,而不是指针。。
3、两个for中间应该加个last_char--;
xiansizhe 2008-09-15
  • 打赏
  • 举报
回复
标准问题TC允许,VC不允许防止用数组下标修改指针地址
如:char * str = "asdf";
str[0]='A';

wangdeqie 2008-09-15
  • 打赏
  • 举报
回复

//可以这么写
#include <iostream>
using namespace std;

char* reverse_string(char *str)
{
char temp;
int i=0,j=0;
while (str[++i])
;
i=i-1;
while (j<i)
{
temp=str[i];
str[i]=str[j];
str[j]=temp;
++j;
--i;
}
return str;

}

void main()
{
char str[5] = "asdf";
printf("%s \n",reverse_string(str));
}

qqwx_1986 2008-09-15
  • 打赏
  • 举报
回复
void reverse_string(char *str){
char *last_char;

for (last_char = str; *last_char != '\0';last_char++);

for (;*last_char != *str; *last_char--){
*str++ = *last_char;
}
*str++ = *last_char; //到这句时str和last_char已经是指向同一个地址了 这是自我赋值 不知lz用意为何
}
realdragon2 2008-09-15
  • 打赏
  • 举报
回复

void reverse_string(char *str){
char *last_char;

for (last_char = str; *last_char != '\0';last_char++);

for (;*last_char != *str; *last_char--){ //这里, 改为: last_char--
*str++ = *last_char;
}
*str++ = *last_char;
}

70,022

社区成员

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

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