文字の並びを文字列と呼びます。ここでは、文字列の文字をひとつずつ処理する方法を確認します。

1行の文字列の入力

1行の文字列を読み込むには、改行が入力されるまで文字を読み込みます。たとえば、以下のように記述することができます:

char ch;                     // 1つの文字を格納するchar型の変数

while(1){
    scanf("%c", &ch);        // 空白・改行を含めて1文字読み込む
    if ( ch == '\n' ) break; // 読み込んだ文字が改行のとき終了する
    // 処理
    .
    .
}

文字とアスキーコード

コンピュータの内部では整数や実数だけでなく文字も数値として扱われています。そこでコンピュータでは、整数値と文字を対応させて文字情報を処理しています。文字に対応付けられた数をアスキーコードといいます。たとえば、次のコードは、文字と対応するアスキーコードを表示します。

char ch = 'A';
printf("%c = %d\n", ch, ch);

int num = 122;
printf("%c = %d\n", num, num);

char 型の変数は、出力変換指定子を %d とすることで、数値(コード)として出力することができます。また、int 型の変数は、出力変換指定子を %c とすることで、対応する文字を出力することができます。 コードの標準出力は次の通りです。

A = 65
z = 122

これは、文字 'A' のアスキーコードが 65 であり、アスキーコード 122 に対応する文字が 'z' であることを示しています。つまり、'B', 'C', ... のアスキーコードが66, 67, ... で、'a', 'b', 'c', ... のアスキーコードが97, 98, 99, ... となることが分かります。

文字の判定

文字が(アスキーコードによって)数値で表されていること、アルファベットには連続した数値が割り当てられていることを利用すると、文字の比較や変換は、数値と同じように行うことができます。たとえば、

'a' <= ch && ch <= 'z'

を満たせば、文字chは英小文字です。また、'a'と'A'の差('a' - 'A')が32であることから、chが小文字の場合は32を引くことにより対応する大文字に変換することができます。一方、chが大文字の場合は32を加算することにより対応する小文字を得ることができます。

また、以下のように、cctypeをインクルードすることで、文字の種類を判定したり、変換する関数を使うことができます。

#include<iostream>
#include<cctype>
using namespace std;

int main(){
  char ch;
  cin >> ch;

  if ( isdigit(ch) ) cout << "digit" << endl;
  if ( isalpha(ch) ) cout << "alpha" << endl;
  if ( islower(ch) ) cout << (char)toupper(ch) << endl;
  if ( isupper(ch) ) cout << (char)tolower(ch) << endl;
  
  return 0;
}

このプログラムは、1つの文字を入力し、それが数字なら"digit"、アルファベットの文字なら"alpha"と出力し、さらに英小文字なら対応する大文字を、大文字なら対応する小文字を出力します。


Reference

 

オンラインジャッジではじめるC/C++プログラミング入門 (マイナビ)

AIZU ONLINE JUDGE のコース問題を題材にした解説書です。各トピックごとに C/C++ 言語の基礎的な内容を学習し、Introduction to Programming の演習問題にチャレンジしていきます。内容は敷居の高いものではなく、プログラミング初学者が取り組む例題からスタートしています。