「tolower」関数を超えた!C言語で文字列を小文字に変換するその他の方法


構文

int tolower(int c);

引数

  • c: 変換対象となる文字または文字列を表す整数値。ASCII コードで表されます。

戻り値

  • 変換後の文字または文字列を表す整数値。成功した場合、変換された小文字が返されます。失敗した場合、EOF が返されます。

動作


char str[] = "HELLO";
int i;

for (i = 0; str[i] != '\0'; i++) {
  str[i] = tolower(str[i]);
}

printf("%s\n", str); // 出力: hello

上記の例では、HELLO という文字列のすべてのアルファベットが大文字に変換され、hello という文字列が出力されます。

注意点

  • tolower() 関数は、文字列を破壊する関数です。そのため、関数を使用する前に文字列のコピーを作成しておくことをお勧めします。
  • tolower() 関数は、ASCII コードを使用しているため、非 ASCII 文字の大文字を小文字に変換できない場合があります。
  • islower(): 文字が小文字かどうかを判定します。
  • isupper(): 文字が大文字かどうかを判定します。
  • toupper(): 小文字を大文字に変換します。

tolower() 関数は、標準ライブラリの ctype.h ヘッダーファイルで宣言されています。このヘッダーファイルをインクルードする必要があります。

#include <ctype.h>


例 1:文字列全体を小文字に変換する

#include <stdio.h>
#include <ctype.h>

int main() {
  char str[] = "THIS IS A STRING";
  int i;

  for (i = 0; str[i] != '\0'; i++) {
    str[i] = tolower(str[i]);
  }

  printf("%s\n", str); // 出力: this is a string

  return 0;
}

この例では、THIS IS A STRING という文字列全体を小文字に変換しています。

例 2:特定の文字のみを小文字に変換する

#include <stdio.h>
#include <ctype.h>

int main() {
  char str[] = "HeLlO, WoRlD!";
  int i;

  for (i = 0; str[i] != '\0'; i++) {
    if (isupper(str[i])) {
      str[i] = tolower(str[i]);
    }
  }

  printf("%s\n", str); // 出力: hello, world!

  return 0;
}

この例では、HeLlO, WoRlD! という文字列中の大文字のみを小文字に変換しています。

#include <stdio.h>
#include <ctype.h>
#include <string.h>

int main() {
  char str1[] = "Hello";
  char str2[] = "hElLo";

  if (strcmp(str1, str2) == 0) {
    printf("2つの文字列は同じです。\n");
  } else {
    printf("2つの文字列は異なります。\n");
  }

  // `tolower()` 関数を使用して文字列を小文字に変換
  strlwr(str1);
  strlwr(str2);

  if (strcmp(str1, str2) == 0) {
    printf("小文字に変換後、2つの文字列は同じです。\n");
  } else {
    printf("小文字に変換後も、2つの文字列は異なります。\n");
  }

  return 0;
}

この例では、HellohElLo という2つの文字列を比較します。最初の比較では、大文字と小文字の違いがあるため、2つの文字列は異なることが示されます。しかし、2番目の比較では、tolower() 関数を使用して両方の文字列を小文字に変換しているため、2つの文字列は同じであることが示されます。

これらの例は、tolower() 関数の基本的な使用方法を示しています。この関数は、さまざまな場面で役立つ強力なツールです。

上記以外にも、tolower() 関数はさまざまな用途に使用できます。以下に、いくつかの例を紹介します。

  • 文字列の照合
  • データベースのクエリの実行
  • コマンドライン引数の処理
  • ファイル名の大文字と小文字を区別せずにファイルを開く


手動で変換する

最も基本的な方法は、ループを使用して文字列内の各文字を個別に処理し、大文字を小文字に変換することです。以下のコードは、この方法を示しています。

void tolower_manual(char str[]) {
  int i;

  for (i = 0; str[i] != '\0'; i++) {
    if (isupper(str[i])) {
      str[i] = str[i] + 'a' - 'A';
    }
  }
}

この関数は、str 配列内のすべての文字を小文字に変換します。

ASCII コードを使用する

大文字と小文字の ASCII コードには 32 の差があることを利用して、文字を小文字に変換することができます。以下のコードは、この方法を示しています。

void tolower_ascii(char str[]) {
  int i;

  for (i = 0; str[i] != '\0'; i++) {
    if (isupper(str[i])) {
      str[i] = str[i] + 32;
    }
  }
}

C言語には、文字列処理を簡単にするために使用できるいくつかのライブラリがあります。これらのライブラリには、文字列を小文字に変換する関数も含まれています。


  • strlwr() 関数 (GNU C ライブラリ)
    strlwr() 関数は、str 文字列を小文字に変換します。
#include <string.h>

int main() {
  char str[] = "HELLO";

  strlwr(str);

  printf("%s\n", str); // 出力: hello

  return 0;
}

上記の方法はいずれも、tolower() 関数の代わりとして使用できます。どの方法を使用するかは、状況によって異なります。

  • 文字列処理ライブラリを使用する
    • 読みやすく、わかりやすい
    • 多くの場合、追加のライブラリのインクルードが必要
    • 処理速度が遅い場合がある
  • ASCII コードを使用する
    • 処理速度が速い
    • 可読性が低い
    • ポータビリティが低い
  • 手動での変換
    • 柔軟性が高い
    • 処理速度が遅い
    • バグが発生しやすい
  • tolower() 関数
    • 読みやすく、わかりやすい
    • 標準ライブラリに含まれているため、多くの場合ですでにインクルードされている
    • 比較的処理速度が速い