Caution
お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。
tolower() / toupper()
英字の大文字・小文字を相互に変換する関数です。『<ctype.h>』に定義されており、大文字・小文字を区別しない文字列比較や入力の正規化によく使います。
構文
// 大文字を小文字に変換します。英字以外はそのまま返します。 // 引数: unsigned char の値(または EOF)。 // 戻り値: 変換後の文字を int で返します。 int tolower(int c); // 小文字を大文字に変換します。英字以外はそのまま返します。 int toupper(int c);
変換対象
| 入力 | tolower() | toupper() |
|---|---|---|
| 大文字(A-Z) | 対応する小文字に変換します。 | そのまま返します。 |
| 小文字(a-z) | そのまま返します。 | 対応する大文字に変換します。 |
| 数字・記号・非ASCII文字 | 変更せずそのまま返します。 | 変更せずそのまま返します。 |
サンプルコード
#include <stdio.h>
#include <ctype.h>
#include <string.h>
// 文字列をすべて小文字に変換します(インプレース)。
void str_tolower(char *s) {
for (; *s; s++) {
*s = (char)tolower((unsigned char)*s);
}
}
// 大文字・小文字を区別しない文字列比較です。
int strcasecmp_manual(const char *a, const char *b) {
while (*a && *b) {
int diff = tolower((unsigned char)*a) - tolower((unsigned char)*b);
if (diff != 0) return diff;
a++; b++;
}
return tolower((unsigned char)*a) - tolower((unsigned char)*b);
}
int main(void) {
// tolower で1文字変換します。
printf("tolower('A') = %c\n", tolower('A')); // 『a』と出力されます。
printf("toupper('z') = %c\n", toupper('z')); // 『Z』と出力されます。
printf("tolower('3') = %c\n", tolower('3')); // 『3』(変化なし)と出力されます。
// 文字列全体を小文字に変換します。
char str[] = "Hello, WORLD! 123";
str_tolower(str);
printf("小文字化: %s\n", str); // 『hello, world! 123』と出力されます。
// 大文字・小文字を無視して比較します。
int cmp = strcasecmp_manual("Apple", "apple");
printf("\"Apple\" と \"apple\" の比較: %d\n", cmp); // 『0』(等しい)と出力されます。
return 0;
}
概要
char 型の変数を直接 tolower() / toupper() に渡すと、符号付き char が負の値をとった場合に未定義動作が発生します。必ず『(unsigned char)c』にキャストしてから渡してください。
これらの関数はロケールの影響を受けます。デフォルト("C" ロケール)では ASCII の A-Z と a-z のみが変換対象です。アクセント付き文字など拡張文字の変換にはロケールを設定する必要があります。
文字の種類判定には『isalpha() / isdigit()』も参照してください。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。