2017-12-20 4 views
1

私はstrchr()の実装を書こうとしました。2番目の引数が単一引用符( 'text')の文字列であるときにstrchrがNULLを返さない理由

char *ft_strchr(const char *s, int c) 
{ 
(unsigned char)c; 
    while (*s) 
    { 
     if (*s == c) 
      return ((char *)s); 
     s++; 
    } 
    if (c == '\0') 
     return ((char *)s); 
    return (NULL); 
} 

それはこの1つを除き、ほとんどの場合に似ています:

printf("%s\n", strchr("Whats up with you, men", ' up')); 

strchr戻り

p with you, men 

しばらく私にバージョンft_strchr戻り

NULL私は好奇心が強い理由strchrどのように行動する。 ' up'unsigned charに変換すると、 'p'(int 538998128)となります。

また、ここでは別の実装が見つかり、このデータでもstrchrとして動作します。

char *ft_strchr(const char *s, int c) { 
    while (*s != (unsigned char) c) { 
     if (!*s) 
      return NULL; 
     s++;} 
    return (char *)s; 
} 

また、私のバージョンは異なっていますが、似たように動作するはずですが、そうではありません。なぜ私は本当に興味がありますか?

ありがとうございます。この式において

+0

'(unsigned char)c;'行自体に 'c'の型は変更されませんが、' int'です。 –

+1

複数の文字を '' up ''に渡していますが、比較するときに1つの文字として扱います。実際に複数の文字を検索する場合には、問題が発生します。また、コンパイラが複数の文字を含む文字リテラルを '' up''を実装として定義したものとして扱う方法を理解しなければなりません。おそらくコンパイラは最後の 'p'またはマルチ文字リテラルの最初のスペースだけを保持します。 – nos

+0

@nosありがとう、私は理解しています、それは単なるテストケースでした。問題は、間違ったキャスト(式にする必要があります)でした。 –

答えて

0

:タイプcharである

*s == c 

用語*sは、符号付きまたは符号なしているcharか否かに応じて、255のいずれか-128 127または0の範囲を有します。 cの値538998128はこの範囲外であるため、比較は真ではありません。

機能の開始時に、あなたは、この行があります。

(unsigned char)c; 

をしかし、これは何もしません。 cの値をunsigned charにキャストし、結果の値は何も行いません。 cの値は変更されません。あなたが表示さ

他の実装では、が*sとそのキャスト値とを比較し、その後unsigned charcをキャスト。そういうわけで、他の実装が期待した結果をもたらすのです。

関連する問題