2016-11-18 7 views
0
#include <iostream> 
using namespace std; 

bool isEqual(const char *a,const char *b) 
{ 
    int lengthA=strlen(a); 
    int lengthB=strlen(b); 
    if(lengthA != lengthB) 
    { 
     return false; 
    } 
    int intLength=sizeof(int); 
    int *ptrA; 
    int *ptrB; 
    int i=0; 
    for(;i<lengthA/intLength;i++) 
    { 
     ptrA=(int*)(a+(i*intLength)); 
     ptrB=(int*)(b+(i*intLength)); 
     if(((*ptrA)^(*ptrB))) 
     { 
      return false; 
     } 
    } 
    i=lengthA-lengthA%intLength+1; 
    for(;i<lengthA;i++) 
    { 
     if(a[i] != b[i]) 
     { 
      return false; 
     } 
    } 
    return true; 
} 

int main() 
{ 
    cout<<isEqual("asasa","asasa")<<endl; 
    return 0; 
} 

私の考えは、charをcharと比較するのではなく、int(4バイトの比較)に型キャストして、等しいかどうかをテストするxor演算を行います。 私の質問は、比較が必要(真、偽)なら正しいことです。私の文字列比較の実装は正しいですか?

答えて

1

これは未定義の動作です。おそらく付き - (。あなたは尖った-するために、オブジェクトがint型されていないintへのポインタを参照解除されている)

コードはほぼ確実にこの IFFポインタが適切に整列されているように、一般的な何かをしている(strcmpのより遅くなりますループが数回展開されました)。

1

このコードは単純なループよりも高速ではありませんが、intに位置合わせ要件がないプラットフォームでは正しく動作しない理由はありません。それらがあるところで、あなたは面白い行動を招待しています...

生産コードでは、これはいくつかのカウントでのレビューに失敗します。最も重要なことは、あまりにも賢い半分、それはどんな措置でもstrcmpを打つことを示す必要があります。私はそれが正直に疑う。

+0

あなたは正しいです。私は整列要件について考えていません。私はちょうど良い実装と思っています。 – user1438832

+0

私は 'strcmp'がそのような方法で実装されることを覚えていると思います。つまり、' char'sの代わりに 'int'sを比較します。 – Gonmator

+0

私の意図はスマートではありません。しかし、私はちょうど意見を知りたいと思って申し訳ありません。私は学んでいます。 – user1438832