C言語には文字列から大文字小文字を区別せずに文字を検索する関数やマクロは存在しません.したがってプログラマが自分でこの機能を実装する必要があります.
実装方法としては,文字列を構成する文字と,検索する文字を一端大文字に変換して,1文字ずつ比較を行っていけば OK です.以下に実装例を示します.
/**
* 文字列から文字を大文字小文字を区別せずに検索する
* @param[in] s 検索対象文字列
* @param[in] c 変換する文字
* @retval 探し出した文字へのポインタ 文字が見つかったとき
* @retval 空ポインタ 見つからなかったとき
*/
char *strchr_ignorecase(const char *s, char c) {
int i = 0;
while ( s[i] != '\0' ) {
if ( toupper((unsigned char)s[i]) == toupper((unsigned char)c) ) {
return (char *)(s + i);
}
i++;
}
return NULL;
}
なお,上記の例では文字を大文字に変換するために ctype.h の toupper 関数を使用しています.これにつきましては,アルファベットの小文字を大文字に変換する をご覧下さい.
以下に,文字列から大文字小文字を区別せずに文字を検索する関数の実装例を示します.
/* header files */
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
/* functions */
char *strchr_ignorecase(const char *, char);
/* main */
int main(void) {
char s[] = "I don't want to march as much as possible.";
char *ret;
int c;
puts("文字を入力してください.");
c = getchar();
/* s が指す文字列に c があるか? */
if ((ret = strchr_ignorecase(s, c)) != NULL ) {
printf("'%c'は%d番目にありました.\n", c, ret - s);
} else {
printf("'%c'はありませんでした.\n", c);
}
return EXIT_SUCCESS;
}
/**
* 文字列から文字を大文字小文字を区別せずに検索する
* @param[in] s 検索対象文字列
* @param[in] c 変換する文字
* @retval 探し出した文字へのポインタ 文字が見つかったとき
* @retval 空ポインタ 見つからなかったとき
*/
char *strchr_ignorecase(const char *s, char c) {
int i = 0;
while ( s[i] != '\0' ) {
if ( toupper((unsigned char)s[i]) == toupper((unsigned char)c) ) {
return (char *)(s + i);
}
i++;
}
return NULL;
}
サンプルプログラムの実行結果は以下のようになります.
文字を入力してください. ( i を入力 ) 'i'は0番目にありました. 文字を入力してください. ( W を入力 ) 'W'は8番目にありました. 文字を入力してください. ( z を入力 ) 'z'はありませんでした.
たくさんあるC言語関連の書籍の中でも特に役に立った本です.よかったら参考にしてみてください.
C言語の実践的参考書.少々値段は張りますが初心者を脱しようとしている人は絶対に読むべきです.
文法だけでなく,コーディングスタイルやデバッグなど文字通り「実践的」なことが書かれているので非常にためになります.
オライリーの本は,読みにくい本が多いのですが本書はとても読みやすくオススメです.
ポインタの解説書としては最高の書籍です.
この1冊でポインタを完全に理解することができます.全くの初学者が読むには敷居が高いですが,入門書を読み終えた後に読むと非常に有益です.