C言語において、文字列を扱うためにはchar型が必要不可欠です。
しかし、char型の使い方や仕様について初心者の方は戸惑うこともあるかもしれません。
そこで本記事では、char型の基礎から応用までをわかりやすく解説します。サンプルコードも交えながら、char型を使ったプログラミングについて学んでいきましょう。
char型とは
char型は、C言語において文字を扱うためのデータ型です。1バイト(8ビット)の範囲で表現され、ASCIIコードによって文字と対応しています。
例えば、以下のような宣言をすることでchar型の変数を定義することができます。
char c = 'A';
この場合、変数cには文字’A’が格納されます。また、文字列を扱う場合には、配列としてchar型を使用します。
char str[] = "Hello, world!";
このように宣言することで、str配列には”H”から”!”までの文字列が格納されます。
char型の宣言方法
char型は、文字を扱うためのデータ型です。char型の変数を宣言するには、以下のようにします。
char 変数名;
例えば、変数名をc
とした場合は以下のようになります。
char c;
このように宣言することで、変数c
は1バイト分のメモリ領域を確保し、そこに文字データを格納できるようになります。
char型の初期化方法
char型の変数を初期化する方法には、以下の3つがあります。
1. 文字リテラルで初期化する方法
char c = 'A';
上記のように、シングルクォーテーションで囲まれた1文字を代入することで、char型の変数を初期化することができます。
2. 文字列リテラルで配列を初期化する方法
char str[] = "Hello";
上記のように、ダブルクォーテーションで囲まれた文字列を代入することで、char型の配列を初期化することができます。この場合、自動的にNULL文字(’\0’)が末尾に追加されます。
3. ASCIIコード値で初期化する方法
char c = 65;
上記のように、ASCIIコード値を代入することでもchar型の変数を初期化することができます。例えば’A’はASCIIコードでは65なので、上記の例では’A’が代入されます。
以上がchar型の変数や配列を初期化する方法です。適切な方法を選択し、プログラム内で必要な値を設定してください。
char型の文字列リテラル
char型の文字列リテラルとは、複数の文字からなる文字列を表現するために使用されます。
C言語では、文字列を扱うためにchar型の配列が用いられますが、文字列リテラルはその配列を初期化するために使われます。
例えば、以下のようなコードで文字列リテラルを使用して配列を初期化することができます。
char str[] = "Hello world!";
この場合、str
という名前のchar型の配列が宣言されています。イコール(=)の右側にあるダブルクォーテーションで囲まれた部分が文字列リテラルです。このように初期化された配列は、自動的にヌル終端文字が末尾に追加されて初期化されます。
また、文字列リテラルは単一引用符(’)ではなくダブルクォーテーション(”)で囲まれている点に注意してください。単一引用符で囲まれたものは1つの文字を表すchar型の定数として扱われます。
char c = 'A'; // char型定数
char型のポインタ
char型のポインタは、文字列を扱う上で非常に重要な役割を果たします。
まず、ポインタとはメモリ上のアドレスを指し示す変数のことです。char型のポインタは、文字列が格納されているメモリ上のアドレスを指し示すことができます。
以下は、char型のポインタを使って文字列を出力するサンプルコードです。
#include <stdio.h>
int main() {
char *str = "Hello, World!";
printf("%s", str);
return 0;
}
このコードでは、char *str
でポインタ変数str
を宣言し、その後に文字列リテラル”Hello, World!”の先頭アドレスを代入しています。そして、printf()
関数で%s
フォーマット指定子を使って文字列を出力しています。
また、以下はchar型の配列と同様に、ポインタ変数でも配列のように各文字にアクセスすることができます。
#include <stdio.h>
int main() {
char str[] = "Hello World!";
char *p = str;
while (*p != '\0') {
printf("%c", *p);
p++;
}
return 0;
}
Hello World!
このコードでは、まずchar型の配列str
に"Hello World!"
という文字列リテラルを代入しています。
そして、その先頭アドレスをポインタ変数p
に代入しています。
最後にwhile文でポインタ変数p
が指し示す値がNULL文字(‘\0’)になるまで繰り返し処理を行い、各文字を1つずつ出力しています。
char型の演算
char型は文字を扱うためのデータ型であるため、通常の数値演算には使用されません。
ですが、やろうと思えばchar型変数を用いた演算は可能です。
例えば、以下のようなコードを考えてみましょう。
char c1 = '0'; //'0' は 48
char result;
result = c1 + 9;
printf("%c\n", result);
この場合、変数result
には文字コードである57が代入されます。
これを、printf()
関数で出力する際に%cフォーマット指定子を用いることで、57と対になる文字'9'
が表示されます。
また、char型同士の減算や乗算も同様に行うことができます。ただし、結果が負の値になった場合やオーバーフローした場合は文字として扱えないので注意が必要です。
char c1 = 'A';
char c2 = 'B';
char result;
result = c2 - c1;
printf("%d\n", result); // 1
result = c1 * 2;
printf("%d\n", result); // -126 (オーバーフロー)
以上のように、char型同士の演算は可能であるため、扱う数値が小さい場合は、int型ではなく1バイトしか使わないchar型を使用することもあります。
char型の入出力
char型の入出力には、scanf()
とprintf()
関数を使用します。
scanf()関数
scanf()
関数は、標準入力からデータを読み込むために使用されます。以下は、char型の変数chに値を入力する例です。
char ch;
scanf("%c", &ch);
上記の例では、%c
というフォーマット指定子を使用しています。
この指定子は、1文字の入力を受け取ります。また、変数chのアドレスを渡すことで、そのアドレスに対応するメモリ領域に値が格納されます。
printf()関数
printf()
関数は、標準出力にデータを出力するために使用されます。以下は、char型の変数chの値を出力する例です。
char ch = 'A';
printf("%c\n", ch);
上記の例では、%c
というフォーマット指定子を使用しています。この指定子は、1文字の出力を行います。また、\n
というエスケープシーケンスを使って改行しています。
char型の注意点
char型は、文字を扱うためのデータ型ですが、注意点がいくつかあります。
1. 文字列の終端には必ず’\0’を付ける
char型で文字列を扱う場合、文字列の最後には必ず’\0’(ヌル文字)を付ける必要があります。これは、文字列の終端を示すために使われます。’\0’がないと、プログラムが正常に動作しない場合があります。
例えば、以下のようなコードでは、配列sに”Hello”という文字列を格納しています。しかし、配列sのサイズは5であり、ヌル文字も含めると6バイト必要です。
そのため、配列sに格納された文字列は、正しく表示されることもあれば、されないこともある不安定な状態になります。
char s[5] = "Hello";
printf("%s", s);
正しいコードは以下のようになります。
char s[6] = "Hello";
//char s[] = "Hello"; こちらでもOK
printf("%s", s);
2. 文字リテラルはシングルクォーテーションで囲む
char型変数や配列を初期化する際に使用する文字リテラル(定数)はシングルクォーテーションで囲む必要があります。
ダブルクォーテーションで囲んだ場合はエラーとなります。
例えば以下のコードではエラーが発生します。
char c = "A"; // エラー
正しいコードは以下のようになります。
char c = 'A';
以上がchar型の注意点です。