高效的字符串反转代码 [英] Highly efficient string reversal code

查看:71
本文介绍了高效的字符串反转代码的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

你好,我是一位经验丰富的专家C程序员,我写了这个代码来反转一个字符串。
我想你们都可以从中学到一些东西!


int reverse(char * reverseme){

int retval = - 1;

if(retval!= NULL){

int len = strlen(retval){

if(len> 0){

int half = len>> 1;

for(; retval< half; retval ++){

reverseme [retval] ^ = reverseme [ len-(retval + 1)];

reverseme [len-(retval + 1)] = reverseme [retval];

reverseme [retval] ^ = reverseme [len - (retval + 1)];

}

}

}

返回retval;

}


-Phil / CERisE

解决方案

做************** @ ymail.com 写道:
< blockquote class =post_quotes>
你好,我是一位经验丰富的专家C程序员



不,你不是。


我写了

此代码用于反转字符串。我想你们都可以从中学到一些东西!



我对此表示怀疑。你应该重新考虑一下。它不是,因为你主题

声称高效。


2008年9月22日14:42,在comp。 lang.c,做************** @ ymail。 com

(do**************@ymail.com)写道:


你好,我是一位经验丰富的专家C程序员



显然,你是自负的,并且

b)错误


我写了

此代码用于反转字符串。



我/是/对不起,包括你和你的雇主。


我想你可以所有学习

来自它!



我确定你是对的。毕竟,/ I /得知你比你声称的C程序员要少得多。


int reverse(char * reverseme){

int retval = -1;

if(retval!= NULL)



无用测试,因为retval被初始化(并且从未改变)到一个不等于NULL的值



{

int len = strlen(retval)



第一次真正的失败。 retval是一个整数,并且

strlen()的参数是一个指向char的指针。使用字符串长度时,您无法从

获得有效结果。一个整数。


第二次失败:你没有#include声明

strlen()函数的标题。因此,您的编译器没有将上述

赋值标记为错误(不兼容类型的参数)


{

if(len> 0)



那么,字符串长度是多少?整数?什么时候它会大于零?
$ blockquote class =post_quotes>
{

int half = len>> 1 ;



样式黑客:为了更清楚地知道半数代表什么类型的数字

,你应该将其编码为

int half = len / 2;

当然,由于len是无意义的值,因此一半也将是

无意义的值。


for(; retval< half; retval ++){

reverseme [retval] ^ = reverseme [len-(retval + 1)] ;



第一次迭代时未定义的行为,当retval == -1

reverseme [-1]超出范围时。


reverseme [len-(retval + 1)] = reverseme [retval];



第一次迭代时未定义的行为 - 同样的原因


reverseme [retval] ^ = reverseme [len-(RETVAL + 1)];



第一次迭代时未定义的行为 - 同样的原因


另外,你搞砸了xor技巧 ,和/ / / $ / $
字符串末尾的值无效。


头端现在包含一个0x00的数组(最多

错误计算的中点),而尾端包含头端xor尾部的

结果。


}

}

}

返回retval;



此返回值的用途是什么?


}


-Phil / CERisE



-

Lew Pitcher


Master Codewright& amp ; JOAT-in-training |已注册的Linux用户#112576
http://pitcher.digitalfreehold.ca/ |可根据要求提供GPG公钥

---------- Slackware - 因为我知道我在做什么。 ------


做**************@ymail.com 写道:


你好,我是一位经验丰富的专家C程序员[...]



s / C程序员/ PLONKed巨魔/

-
Er ********* @ sun.com


Hello, I''m a highly experienced expert C programmer and I''ve written
this code to reverse a string in place. I think you could all learn
something from it!

int reverse(char* reverseme){
int retval=-1;
if(retval!=NULL){
int len=strlen(retval){
if(len>0){
int half=len>>1;
for(;retval<half;retval++){
reverseme[retval]^=reverseme[len-(retval+1)];
reverseme[len-(retval+1)]=reverseme[retval];
reverseme[retval]^=reverseme[len-(retval+1)];
}
}
}
return retval;
}

-Phil/CERisE

解决方案

do**************@ymail.com wrote:

Hello, I''m a highly experienced expert C programmer

No, you are not.

and I''ve written
this code to reverse a string in place. I think you could all learn
something from it!

I doubt it. You should rethink it. It is not, as you subject line
claims "highly efficient".


On September 22, 2008 14:42, in comp.lang.c, do**************@ymail.com
(do**************@ymail.com) wrote:

Hello, I''m a highly experienced expert C programmer

Apparently, you are
a) egotistical, and
b) wrong

and I''ve written
this code to reverse a string in place.

I am /so/ sorry, both for you and your employer.

I think you could all learn
something from it!

I''m sure that you are right. After all, /I/ learned that you are much less
than the C programmer that you claim to be.

int reverse(char* reverseme){
int retval=-1;
if(retval!=NULL)

Useless test, as retval was initialized (and never altered) to a value
that will not equate to NULL

{
int len=strlen(retval)

First real failure. retval is an integer, and the argument to
strlen() is a pointer-to-char. You can''t get a valid result from
taking the "string length" of an integer.

Second failure: you did not #include the header that declares the
strlen() function. Thus, your compiler did not flag the above
assignment as an error (argument of incompatable type)

{
if(len>0)

So, what is the "string length" of an integer? And when would it be
greater than zero?

{
int half=len>>1;

Style hack: To be clearer to the intent of what sort of number
half represents, you should have coded this as
int half = len / 2;
Of course, since len is a nonsense value, half will also be a
nonsense value.

for(;retval<half;retval++){
reverseme[retval]^=reverseme[len-(retval+1)];

Undefined behaviour on first iteration, when retval == -1
reverseme[-1] is out of bounds.

reverseme[len-(retval+1)]=reverseme[retval];

Undefined behaviour on first iteration - same reason

reverseme[retval]^=reverseme[len-(retval+1)];

Undefined behaviour on first iteration - same reason

Plus, you''ve screwed up the "xor trick", and wiped out /both/
ends of the string with invalid values.

The head end now contains an array of 0x00 (up to
the ill-computed "midpoint"), while the tail end contains the
results of the head end xor the tail end.

}
}
}
return retval;

Of what use is this return value?

}

-Phil/CERisE

--
Lew Pitcher

Master Codewright & JOAT-in-training | Registered Linux User #112576
http://pitcher.digitalfreehold.ca/ | GPG public key available by request
---------- Slackware - Because I know what I''m doing. ------


do**************@ymail.com wrote:

Hello, I''m a highly experienced expert C programmer [...]

s/C programmer/PLONKed troll/

--
Er*********@sun.com


这篇关于高效的字符串反转代码的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆