2

Cプログラミングで2つの文字列を比較するためにstrcmpで使用されたアルゴリズムを説明できる人はいますか?

この戻り値を理解できませんでした。「Levenstienアルゴリズム」のようなアルゴリズムを使用して、2つの文字列間の距離を見つけます...

4

3 に答える 3

6

標準CライブラリであるglibcのGNU実装はオープンソースであり、興味があればstrcmp.cを読むことができます。それほど多くはありません。ここにあります:

/* Compare S1 and S2, returning less than, equal to or
   greater than zero if S1 is lexicographically less than,
   equal to or greater than S2.  */
int strcmp (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;
}
于 2012-06-07T07:07:46.673 に答える
4

strcmp文字列距離アルゴリズムではありません。これは文字列比較アルゴリズムであり、2 つの文字列が等しい (リターン コード ゼロ) か、そうでない場合は、2 つの文字列のどちらがその単語の何らかの意味で「大きい」か (正のまたは負の値)。

返される結果の大きさは指定されていません。つまり、常に 1、0、または -1 を返すことができます。または、距離の測定値 (たとえば、レーベンシュタイン、単純な減算など) の実際の積分距離を返すこともできます。実際にstrcmpは、パフォーマンス上の理由から、実際の文字列距離アルゴリズムを使用して実装されることはありません (2 つの文字列の等価性を判断するために最小限の作業を行って、終了します)。

于 2012-06-07T06:58:37.793 に答える
3

strcmp()のこれらのドキュメントはかなり明確です

ゼロ値は、両方の文字列が等しいことを示します。ゼロより大きい値は、一致しない最初の文字の値がstr2よりもstr1の方が大きいことを示します。また、ゼロ未満の値はその逆を示します。

つまり、辞書式順序、または2つの文字列間のさらに正確なアルファベット順をチェックします。

于 2012-06-07T07:01:16.390 に答える