高效的字符串反转代码 [英] Highly efficient string reversal code
问题描述
你好,我是一位经验丰富的专家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 programmerNo, 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 programmerApparently, 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屋!