字符串反向排列

班公湖里洗过脚 2013-06-06 11:23:12
#include<stdio.h>
#include<string.h>

void reverse_string(char *str)
{

char *last_char;
for(last_char=str;*last_char!='\0';last_char++)
;
/*printf("%c",*last_char);*/
last_char--;

while(str<last_char)
{
char temp;
temp=*str;
*str++=*last_char;
*last_char--=temp;
}
printf("\n***************************%s\n",str);
}


int main(void)
{

char sss[]={"hello"};
char *ss;
ss=sss;
reverse_string(ss);
printf("%s\n",ss);
return 0;
}


运行结果是
***************************leh
olleh

怎么不是
***************************olleh
olleh

求解
...全文
203 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
buyong 2013-06-08
  • 打赏
  • 举报
回复
another method, using std::string::reverse
赵4老师 2013-06-08
  • 打赏
  • 举报
回复
http://www.microsoft.com/visualstudio/chs/downloads#d-2010-express 点开Visual C++ 2010 Express下面的语言选‘简体中文’,再点立即安装 再参考C:\Program Files\Microsoft Visual Studio 10.0\VC\crt\src\strrev.c
/***
*strrev.c - reverse a string in place
*
*       Copyright (c) Microsoft Corporation. All rights reserved.
*
*Purpose:
*       defines _strrev() - reverse a string in place (not including
*       '\0' character)
*
*******************************************************************************/

#include <cruntime.h>
#include <string.h>

/***
*char *_strrev(string) - reverse a string in place
*
*Purpose:
*       Reverses the order of characters in the string.  The terminating
*       null character remains in place.
*
*Entry:
*       char *string - string to reverse
*
*Exit:
*       returns string - now with reversed characters
*
*Exceptions:
*
*******************************************************************************/

char * __cdecl _strrev (
        char * string
        )
{
        char *start = string;
        char *left = string;
        char ch;

        while (*string++)                 /* find end of string */
                ;
        string -= 2;

        while (left < string)
        {
                ch = *left;
                *left++ = *string;
                *string-- = ch;
        }

        return(start);
}
然后参考C:\Program Files\Microsoft Visual Studio 10.0\VC\crt\src\intel\strrev.asm
        page    ,132
        title   strrev - reverse a string in place
;***
;strrev.asm - reverse a string in place
;
;       Copyright (c) Microsoft Corporation. All rights reserved.
;
;Purpose:
;       defines _strrev() - reverse a string in place (not including
;       '\0' character)
;
;*******************************************************************************

        .xlist
        include cruntime.inc
        .list

page
;***
;char *_strrev(string) - reverse a string in place
;
;Purpose:
;       Reverses the order of characters in the string.  The terminating
;       null character remains in place.
;
;       Algorithm:
;       char *
;       _strrev (string)
;             char *string;
;             {
;             char *start = string;
;             char *left = string;
;             char ch;
;
;             while (*string++)
;                     ;
;             string -= 2;
;             while (left < string)
;                     {
;                     ch = *left;
;                     *left++ = *string;
;                     *string-- = ch;
;                     }
;             return(start);
;             }
;
;       NOTE: There is a check for an empty string in the following code.
;       Normally, this would fall out of the "cmp si,di" instruction in the
;       loop portion of the routine.  However, if the offset of the empty
;       string is 0 (as it could be in large model), then the cmp does not
;       catch the empty string and the routine essentially hangs (i.e., loops
;       moving bytes one at a time FFFFh times).  An explicit empty string
;       check corrects this.
;
;Entry:
;       char *string - string to reverse
;
;Exit:
;       returns string - now with reversed characters
;
;Uses:
;
;Exceptions:
;
;*******************************************************************************

        CODESEG

        public  _strrev
_strrev proc \
        uses edi esi, \
        string:ptr byte

        mov     edi,[string]    ; di = string
        mov     edx,edi         ; dx=pointer to string; save return value

        mov     esi,edi         ; si=pointer to string
        xor     eax,eax         ; search value (null)
        or      ecx,-1          ; cx = -1
repne   scasb                   ; find null
        cmp     ecx,-2          ; is string empty? (if offset value is 0, the
        je      short done      ; cmp below will not catch it and we'll hang).

        sub     edi,2           ; string is not empty, move di pointer back
                                ; di points to last non-null byte

lupe:
        cmp     esi,edi         ; see if pointers have crossed yet
        jae     short done      ; exit when pointers meet (or cross)

        mov     ah,[esi]        ; get front byte...
        mov     al,[edi]        ;   and end byte
        mov     [esi],al        ; put end byte in front...
        mov     [edi],ah        ;   and front byte at end
        add     esi,1           ; front moves up...
        sub     edi,1           ;   and end moves down
        jmp     short lupe      ; keep switching bytes

done:
        mov     eax,edx         ; return value: string addr

        ret                     ; _cdecl return

_strrev endp
        end
NA_YI_ZHAN 2013-06-07
  • 打赏
  • 举报
回复
引用 1 楼 hugett 的回复:
因为在函数中str最后已经不是指向字符串的开始了。。可以改为下边这样。。

#include<stdio.h>
#include<string.h>

void reverse_string(char *str)
{
	char *last_char;
	for(last_char=str;*last_char!='\0';last_char++);
	/*printf("%c",*last_char);*/
	last_char--;

	char *tmpstr = str;//先保存str的值
	while(str<last_char)
	{
		char temp;
		temp=*str;
		*str++=*last_char;//str被改动了。。
		*last_char--=temp;
	}
	printf("\n***************************%s\n",tmpstr);
}


int main(void)
{
	char sss[]={"hello"};
	char *ss;
	ss=sss;
	reverse_string(ss);
	printf("%s\n",ss);
	return 0;
}
这个运行不了啊!
hugett 2013-06-07
  • 打赏
  • 举报
回复
因为在函数中str最后已经不是指向字符串的开始了。。可以改为下边这样。。

#include<stdio.h>
#include<string.h>

void reverse_string(char *str)
{
	char *last_char;
	for(last_char=str;*last_char!='\0';last_char++);
	/*printf("%c",*last_char);*/
	last_char--;

	char *tmpstr = str;//先保存str的值
	while(str<last_char)
	{
		char temp;
		temp=*str;
		*str++=*last_char;//str被改动了。。
		*last_char--=temp;
	}
	printf("\n***************************%s\n",tmpstr);
}


int main(void)
{
	char sss[]={"hello"};
	char *ss;
	ss=sss;
	reverse_string(ss);
	printf("%s\n",ss);
	return 0;
}
bewinged 2013-06-07
  • 打赏
  • 举报
回复
才发现,有这么多的库函数没用过,good
xueda120 2013-06-07
  • 打赏
  • 举报
回复
#include<stdio.h>
#include<string.h>

int main(void)
{

char sss[]={"hello"};
char *ss;
ss=sss;
strrev(ss); //调用strrev()库函数
printf("%s\n",ss);
getchar();
return 0;
}
starytx 2013-06-07
  • 打赏
  • 举报
回复

void rever(char *src ) 
{   
    if (src == 0)
    {
        return;
    }
    char *p1 = src;
    char *p2 = src + strlen(src) - 1 ;
    char temp;
    while(p1 < p2)
    {
        temp = *p1;
        *p1++ = *p2;
        *p2-- = temp;
    }
}
xueda120 2013-06-07
  • 打赏
  • 举报
回复

#include<stdio.h>
#include<string.h>

void reverse_string(char *str)
{

char *last_char,*s;
for(last_char=str;*last_char!='\0';last_char++);
/*printf("%c",*last_char);*/
last_char--;
s=str;
while(str<last_char)
{
char temp;
temp=*str;
*str++=*last_char;
*last_char--=temp;
}
printf("\n***************************%s\n",s);
}


int main(void)
{

char sss[]={"hello"};
char *ss;
ss=sss;
reverse_string(ss);
printf("%s\n",ss);

getchar();
return 0;
}

69,371

社区成员

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

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