C言語の達人技!『toupper』関数を使いこなして自在な文字列操作を実現
仕組み
toupper
関数は、1文字の引数を受け取り、その文字を大文字に変換して返します。英字以外の文字や、変換対象ではない文字列を渡した場合には、元の文字をそのまま返します。
使用方法
#include <stdio.h>
int main() {
char str[] = "hello, world!";
int i;
for (i = 0; str[i] != '\0'; ++i) {
str[i] = toupper(str[i]);
}
printf("%s\n", str);
return 0;
}
このプログラム例では、str
という変数に "hello, world!" という文字列を代入しています。その後、for
ループを使用して文字列を反復処理し、各文字を toupper
関数で変換しています。最後に、変換後の文字列を printf
関数で出力します。
HELLO, WORLD!
- ロケール設定によっては、
toupper
関数が英字以外の文字にも影響を与える場合があります。ロケールに依存しない変換が必要な場合は、towupper
関数を使用することができます。 toupper
関数は、文字列全体を一括で変換したい場合に便利です。個々の文字を大文字に変換したい場合は、islower
関数と組み合わせて使用することができます。
文字列全体を大文字に変換
#include <stdio.h>
#include <ctype.h>
int main() {
char str[] = "This is a test string.";
int i;
for (i = 0; str[i] != '\0'; ++i) {
str[i] = toupper(str[i]);
}
printf("Converted string: %s\n", str);
return 0;
}
出力結果
Converted string: THIS IS A TEST STRING.
特定の文字列を大文字に変換
#include <stdio.h>
#include <ctype.h>
int main() {
char str[] = "Hello, World!";
int i = 7;
str[i] = toupper(str[i]);
printf("Converted string: %s\n", str);
return 0;
}
出力結果
Converted string: Hello, WORLD!
文字列内の英小文字を反転
#include <stdio.h>
#include <ctype.h>
int main() {
char str[] = "Mixed CaSE String";
int i;
for (i = 0; str[i] != '\0'; ++i) {
if (islower(str[i])) {
str[i] = toupper(str[i]);
} else if (isupper(str[i])) {
str[i] = tolower(str[i]);
}
}
printf("Converted string: %s\n", str);
return 0;
}
出力結果
Converted string: mIXED cASE sTRING
ロケールに依存しない大文字変換
#include <stdio.h>
#include <wctype.h>
int main() {
wchar_t str[] = L"This is a test string with non-ASCII characters: €£¥";
int i;
for (i = 0; str[i] != '\0'; ++i) {
str[i] = towupper(str[i]);
}
wprintf(L"Converted string: %s\n", str);
return 0;
}
Converted string: THIS IS A TEST STRING WITH NON-ASCII CHARACTERS: €€¥
islower と tolower 関数
この方法は、まず islower
関数を使用して引数が小文字かどうかを判定し、小文字であれば tolower
関数で変換します。大文字の場合はそのまま返します。
#include <stdio.h>
#include <ctype.h>
int main() {
char c = 'h';
if (islower(c)) {
c = toupper(c);
}
printf("Converted character: %c\n", c);
return 0;
}
条件演算子
条件演算子を使用して、引数が小文字であれば大文字に変換し、そうでなければそのまま返すことができます。
#include <stdio.h>
int main() {
char c = 'h';
char convertedChar = (islower(c)) ? toupper(c) : c;
printf("Converted character: %c\n", convertedChar);
return 0;
}
手動の文字コード変換
ASCII 文字セットを使用している場合は、各文字の英小文字変換を個別に処理することができます。
#include <stdio.h>
int main() {
char c = 'h';
if (c >= 'a' && c <= 'z') {
c -= 'a' - 'A';
}
printf("Converted character: %c\n", c);
return 0;
}
カスタム変換関数
独自の変換規則が必要な場合は、カスタム変換関数を作成することができます。この関数は、引数の文字コードを確認し、必要な変換を実行します。
#include <stdio.h>
char myToupper(char c) {
if (c >= 'a' && c <= 'z') {
return c - 'a' + 'A';
} else {
return c;
}
}
int main() {
char c = 'h';
char convertedChar = myToupper(c);
printf("Converted character: %c\n", convertedChar);
return 0;
}
最適な方法の選択
使用する方法は、状況によって異なります。
- ASCII 以外の文字セットを使用している場合
手動の文字コード変換またはカスタム変換関数 - 簡潔なコードを求める場合
条件演算子 - 個々の文字を制御したい場合
islower
とtolower
関数 - シンプルで汎用性の高い方法
toupper
関数