2010-12-21 19 views
3
int strcmp(const char *s1, const char *s2) 

{ 
    int ret = 0; 

    while (!(ret = *(unsigned char *) s1 - *(unsigned char *) s2) && *s2) ++s1, ++s2; 

    if (ret < 0) 

    ret = -1; 
    else if (ret > 0) 

    ret = 1 ; 

    return ret; 
} 

私はからコードを確認します。 strlen(s2)>strlen(s1)の場合は、++s1がこの範囲外になることがあります。残念なことに、関数はエラーを返します。Cのstrcmpのソースコード

+0

あなたのリンクのコードでわかる小さな問題の1つは、strcmpとstrncmpが異なる結果を返すことです。 strcmpは結果を-1 .. + 1の範囲に不必要にクランプし、strncmpは完全な差を返します。 – kusma

答えて

1

いいえ、s2が '\ 0'終了していれば、このような問題はありません。

1

ゼロ終端のためにs1が暗黙のうちに保護されます。ゼロ終了は、 "*(符号なし文字)s1"と "(符号なしchar *)s2"との間に差異が生じ、ループを終了させる。

コードは正しく表示されます。

7

いいえ、ループは* s1と* s2がおよび * s2が0でない間だけ継続するため、問題はありません。s1が短い場合、s1の最後に\ 0になると、等価条件が破られ、ループが停止します。

+0

ありがとうございます。あなたは素晴らしいです! –

関連する問題