これは、文字列が空のときにfalseを返すstrcmpを実行する良い方法です

StackOverflow https://stackoverflow.com/questions/1606596

  •  05-07-2019
  •  | 
  •  

質問

別の条件が必要です-まだ実行時間は高速ですが、より安全-文字列のいずれかまたは両方が空の場合にfalseを返します:

int speicial_strcmp(char *str1, char* str2 )
{

    if(*str1==*str2 =='\0')
         return 0;

     return strcmp(str1,str2);

}
役に立ちましたか?

解決

いいえ、動作しないため、それは良い方法ではありません。

if(*str1==*str2 =='\0')

次のように評価されます:

bool tmp1 = *str1==*str2;
bool tmp2 = tmp1 == '\0';
if (tmp2)

つまり、boolは整数にプロモートされるため、文字列が異なる文字で始まる場合は常にテストがtrueを返します( tmp1 はfalseになり、0に変換されるため、 tmp2 がtrueになります)

コンパイラを出し抜こうとしないでください。高速なコードを書くことは、できるだけ少ないコード行を書くことでも、可能な限り短い行を書くことでもありません。この方法で == をつなぎ合わせても意味があったとしても、それが速くなる理由はありません。理解できるコードを書くだけで、正しく書くことができます。

他のヒント

提案されたアーリーアウトテストを正しく実装したとしても、この種のことを行うことで物事を高速化することはほとんどありません。 / p>

strcmp()のコードは次のとおりです。

int
strcmp (p1, p2)
     const char *p1;
     const char *p2;
{
  register const unsigned char *s1 = (const unsigned char *) p1;
  register const unsigned char *s2 = (const unsigned char *) p2;
  unsigned reg_char c1, c2;

  do
    {
      c1 = (unsigned char) *s1++;
      c2 = (unsigned char) *s2++;
      if (c1 == '\0')
    return c1 - c2;
    }
  while (c1 == c2);

  return c1 - c2;
}

すでに意味のある速さです。無関係なチェックでは、興味のないケースのみが遅くなります。

if( *str1 == 0 || *str2 == 0 )
   return 0;

指定した例は、正しく実行されません。 strcmp()は、最初の異なる文字で停止します。両方の文字列が空の場合、「特別なケース」で満たされている場合上記では、これは指定した例と同じくらい迅速に処理されます。

上記のように両方の文字列に特別なハンドラーを追加することにより、そうでない場合のみ、対応する速度が遅くなります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top