C 言語で文字列を小文字に変換
この記事では、C 言語で文字列を小文字に変換する方法について複数の方法を紹介します。
文字列を C 言語で小文字に変換するには tolower
関数を使用する
関数 tolower
は <ctype.h>
ヘッダファイルで定義されている C 標準ライブラリの一部です。tolower
は int
型の引数を 1つ取り、対応する小文字表現が存在する場合にはその文字の変換後の値を返します。渡された文字は EOF か unsigned char
型の表現が可能なものでなければならないことに注意してください。この場合、char
ポインタを文字列リテラル値で初期化し、各文字を反復処理して小文字に変換します。ただし、char
型の引数を tolower
関数に渡す場合は unsigned char
にキャストしなければならないことに注意してください。
#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main() {
char *str = "THIS STRING LITERAL IS ARBITRARY";
printf("%s\n", str);
for (size_t i = 0; i < strlen(str); ++i) {
printf("%c", tolower((unsigned char)str[i]));
}
printf("\n");
exit(EXIT_SUCCESS);
}
出力:
THIS STRING LITERAL IS ARBITRARY
this string literal is arbitrary
先ほどの例では、元の文字列の内容を変換された小文字で上書きしています。代わりに、calloc
を用いて別の char
ポインタを確保することもできます。これは malloc
と似ていますが、確保したメモリをゼロにして変換後の文字列を別個に格納する点が異なります。ポインタはプログラムが終了する前に解放されるべきであることに注意するか、プロセスが長時間実行されている場合は、文字列変数が不要になったらすぐに解放されるべきです。
#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main() {
char *str = "THIS STRING LITERAL IS ARBITRARY";
printf("%s\n", str);
size_t len = strlen(str);
char *lower = calloc(len + 1, sizeof(char));
for (size_t i = 0; i < len; ++i) {
lower[i] = tolower((unsigned char)str[i]);
}
printf("%s", lower);
free(lower);
exit(EXIT_SUCCESS);
}
出力:
THIS STRING LITERAL IS ARBITRARY
this string literal is arbitrary
C 言語でカスタム関数を使用して文字列を小文字に変換する
より柔軟な解決策は、文字列変数を引数に取り、変換された小文字の文字列を別のメモリ上に返すカスタム関数を実装することです。この方法は、先ほどの例を main
関数からデカップリングしたものです。この例では、ヌル文字で終端する文字列が格納されている char*
と文字列の長さを表す size_t
型の整数を引数にとる関数 toLower
を作成しました。この関数は、calloc
関数を使用してヒープにメモリを割り当てます。したがって、呼び出し元は、プログラムが終了する前にメモリの割り当てを解除する責任があります。
#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char *toLower(char *str, size_t len) {
char *str_l = calloc(len + 1, sizeof(char));
for (size_t i = 0; i < len; ++i) {
str_l[i] = tolower((unsigned char)str[i]);
}
return str_l;
}
int main() {
char *str = "THIS STRING LITERAL IS ARBITRARY";
printf("%s\n", str);
size_t len = strlen(str);
char *lower = toLower(str, len);
printf("%s", lower);
free(lower);
exit(EXIT_SUCCESS);
}
出力:
THIS STRING LITERAL IS ARBITRARY
this string literal is arbitrary