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 以外の文字セットを使用している場合
    手動の文字コード変換またはカスタム変換関数
  • 簡潔なコードを求める場合
    条件演算子
  • 個々の文字を制御したい場合
    islowertolower 関数
  • シンプルで汎用性の高い方法
    toupper 関数