私は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;
}
また、私のバージョンは異なっていますが、似たように動作するはずですが、そうではありません。なぜ私は本当に興味がありますか?
ありがとうございます。この式において
'(unsigned char)c;'行自体に 'c'の型は変更されませんが、' int'です。 –
複数の文字を '' up ''に渡していますが、比較するときに1つの文字として扱います。実際に複数の文字を検索する場合には、問題が発生します。また、コンパイラが複数の文字を含む文字リテラルを '' up''を実装として定義したものとして扱う方法を理解しなければなりません。おそらくコンパイラは最後の 'p'またはマルチ文字リテラルの最初のスペースだけを保持します。 – nos
@nosありがとう、私は理解しています、それは単なるテストケースでした。問題は、間違ったキャスト(式にする必要があります)でした。 –