|
|
|
| 2008/08/28 09:11||▲
|
|
|
strchr関数は、文字列の中から指定した文字を見つけるための関数です。memchr関数とも似ていますが、ナル文字が現れるまで探索を続けるか、予め長さを指定しているかの違いがあります。機能的にはよく似ていても、探索の終了条件が異なるとコードはかなり違ってきます。
#include <stddef.h>
char *strchr(const char *s, int c) { c = (char)c; do if (*s == c) return (char*)s; while (*s++ != '\0'); return NULL; }
ここで、最初の行でcをchar型にキャストしていますが、これは元のcがCHAR_MIN〜CHAR_MAXの範囲に収まっているかどうかわからないためです。charが符号付きの場合、このようなキャストは処理系定義の動作になりますが、GCCでは期待通りの結果になるため、この際移植性は捨てて、このような書き方にしました。
strchr関数は、memchr関数と同様、C++では以下の2種類の形式が多重定義されています。
char* strchr(char* s, int c); const char* strchr(const char* s, int c);
外部定義されたstrchr関数のコードはCで記述することになりますから、上記のいずれとも合致しないわけですが、C結合にしてしまえば、この程度の型の違いは無視できます(この辺りの事情はmemchr関数と同じです)。したがって、
extern "C" char* strchr(char*, int);
inline const char* strchr(const char* __s, int __c) { return strchr(const_cast(__s), __c); }
とすればOKです。
|
| 2006/04/13 10:16|文字列操作|TB:0|CM:2|▲
|
|
|
コメント
|
strchr関数の探索範囲は、終端のナル文字を含みます。なので、現在のコードでは、第2引数にナル文字を渡したときの結果が標準とは異なります。
|
マイケル #-|2006/04/13(木) 23:09 [ 編集 ]
|
> strchr関数の探索範囲は、終端のナル文字を含みます。 いわれてみればそうですね。 直しておきます。
|
たかぎ #ftr86F3A|2006/04/13(木) 23:19 [ 編集 ]
| |
コメントの投稿
| |
|
| |
トラックバック
|
トラックバックURLはこちら
http://libc.blog47.fc2.com/tb.php/42-f3b05b91
|
| |
|
|
ホーム
全記事一覧
<< 前の記事
次の記事 >>
|
| |