見出し画像

C言語教室 第5回 - 文字と文字列

今までは主に数を相手にしてきましたが、そろそろ文字について覚えましょう。文字を扱う変数の型は char型 です。

#include <stdio.h>

void main() {
  char c;
  
  c = ‘a’;
  printf(“%c\n”, c);
}

当然

a

と表示されますよね。文字はシングルクォートで1文字を括ります。1文字以上を括ったり1文字であっても日本語を括るとエラーとなります。C言語で扱う「文字」はアルファベットなどの1バイトで表すことができる文字のみです。日本語などのマルチバイト文字を扱う場合には、そのための特別な型があるのですが具体的な型は処理系によって異なるので、今回は省きます。

文字型を数値に代入したり、数値から文字型に代入すると、その処理系における文字コードが使われます。文字型の数値として範囲は-128~127です。そうです整数型でもマイナスが使えますので、文字型であってもマイナスの数値になることがあります。

文字のうち表示されないような制御文字は数値で表現する他にエスケープシーケンスと呼ばれる表記方法で1文字を表すことができます。代表的なものとして

\n - 改行
\r - 復帰
\t - タブ

などがあります。表示されない文字だけではなく文字を括るのに使われるシングルクォート(‘)やダブルクオート(“)も、括る文字と解釈されてしまうのを避けるためにエスケープシーケンスを使って表現します。さらにこれらの表現が用意されていない文字を使うために8進数または16進数でコードを指定することもできます。

エスケープシーケンス一覧表

printfで出てくる文字の中に\nが出てきていたのは改行するということだったんです。

※エスケープシーケンスの最初の文字はもともとはバックスラッシュ(\)です。この文字が日本語では(¥の1バイト表現)という記号になるため、良く混乱します。環境によってキーボードに¥と刻印されていても\と表示されることもありますし、その逆のこともあります。なお、この文字を表現したい時は\\と2文字書くと\1文字だと解釈されます。2文字書いてもちゃんと1バイト(char型)に収まります。

さて文字を扱えるようになったので複数の文字を使うにはどうすれば良いでしょうか。

#include <stdio.h>

void main() {
  char c1 ;
  char c2 ;
  char c3 ;

  c1 = 'O';
  c2 = 'k';
  c3 = '.';

  printf("%c%c%c\n", c1, c2, c3);
}

これを実行すれば

Ok.

と出ます。ところで、こういう時は「配列を使え!」というのは、もう気が付きますよね。

#include <stdio.h>

void main() {
  char c[3];
  int i;

  c[0] = 'O';
  c[1] = 'k';
  c[2] = '.';

  for( i = 0; i < 3; i++) {
    printf("%c", c[i]);
  }
  printf("\n");
}

こうやっても


Ok.

が出ます。配列を使えば良いとはいえ、常に1文字ずつ扱うのはなかなか面倒です。C言語には複数の文字をまとめて扱うための表現として「文字列」というものがあります。但しあくまで表現方法であって文字列という「型」はありません。文字列はあくまで文字の集まりであってchar型の配列として扱います。

#include <stdio.h>

void main() {
  char c[3];
  int i;

  c = "Ok.";
  for( i = 0; i < 3; i++) {
    printf("%c", c[i]);
  }
  printf("\n");
}

はい。

Ok.

が出ましたね。文字列はシングルクォートではなくダブルクオートで文字を括ります。エスケープシーケンスは同じものが使えます。

さてC言語の文字列には大きな秘密があります。ダブルクオートで括った文字の集まりには、プログラム上のどこにも書いてありませんが、文字列の最後に必ずヌル文字と呼ばれる値が0の文字が置かれます。


#include <stdio.h>

void main() {
  char c[4];
  int i;
  int v;

  c = "Ok.";
  for( i = 0; i < 4; i++) {
    v = c[i];
    printf("%d\n", v);
  }
}

と整数に直して数値にしてから表示してみます。

79
107
46
0

※79. 107, 46 は、それぞれ O k . の文字コードです。

そうなんです。”Ok.”という文字列は最後に0が付いた4バイトの文字列なんです。C言語の文字列は値が0の文字を見つけると、そこで文字列が終わりだと判断するのです。そのため文字列の中に値が0の文字を含めることはできません。無理やり入れても0を見つけると文字列が終わったと判断されるので、そこから後ろがあることに気が付きません。

この約束があることにより、いちいち文字列が何文字あるかを覚えている必要がなくなります。長さが知りたければ先頭から0が見つかるまで数えてみれば良いだけです。

#include <stdio.h>

void main() {
  char c[] = "Ok.";

  printf("%s\n", c);
}

これだけで

Ok.

と出るようになりましたね。変数の宣言のところで文字列を代入してしまえば、配列の大きさも宣言から省くことができます。また文字列を出力するのであれば%sを使うことができます。これで文字列を扱うのもだいぶ楽にできるようになりましたね。

C言語の文字列は最後にヌル文字が付けられるし、文字列を扱う時は最後にヌル文字があることが期待される(文字列の途中にヌル文字が含まれていると正しく動作しない)。

お約束

課題

  • 文字列”abc”の長さを数えて表示する(長さにヌル文字は含めない)。

  • 文字列”abc”の中で’c’が何番目にあるか探して表示する(最初の文字であれば1)。


課題の解答例

前回の課題の解答は以下の記事にあります。

C言語教室 番外編1 - 第4回の課題について



ヘッダ画像は、こんなページを見つけてフリーフォントを使いました。
https://text-img.cman.jp/


この記事が気に入ったらサポートをしてみませんか?