🖥️

【C言語超入門】 第04回 char型とgetchar

に公開

https://youtu.be/YGlahwPTqp8

四国めたん
\textcolor{pink}{四国めたん: }教師役ですわ

ずんだもん
\textcolor{lime}{ずんだもん: }生徒役なのだ

\footnotesize \textcolor{pink}{四国めたん:} 皆さん、こんにちは。四国めたんです

\footnotesize \textcolor{lime}{ずんだもん:} ずんだもんなのだ。こんにちはなのだ

\footnotesize \textcolor{pink}{四国めたん:} 今回もC言語のお勉強をしていきましょう

\footnotesize \textcolor{lime}{ずんだもん:} レッツゴーなのだ

\footnotesize \textcolor{pink}{四国めたん:} 第4回となる今回は char型とgetchar についてお話ししますわ

\footnotesize \textcolor{lime}{ずんだもん:} char型getchar

\footnotesize \textcolor{pink}{四国めたん:} はい、 char型int型float型 と同じくC言語の基本的な型のひとつですわ

\footnotesize \textcolor{pink}{四国めたん:} getcharC標準関数 のひとつで、キーボードから1文字の入力を受け付ける関数ですわね

\footnotesize \textcolor{lime}{ずんだもん:} お~、今までは文字列を出力することはできても、入力はできなかったから、すごいのだ

\footnotesize \textcolor{pink}{四国めたん:} キーボードから入力を受け付けることで、いろいろとインタラクティブなことができるようになりますわ

getchar関数

\footnotesize \textcolor{pink}{四国めたん:} まずはgetchar関数について見ていきますわね

\footnotesize \textcolor{lime}{ずんだもん:} getchar関数がどのように動くのか、早く教えて欲しいのだ

\footnotesize \textcolor{pink}{四国めたん:} まずはプログラムを書いて実行してみましょう

#include <stdio.h>

void main(){
  int c = 0;
  printf("キーボードから1文字入力して下さい\n");
  c = getchar();
  printf("キーボードからの入力は\"%c\"です\n", c);
}

\footnotesize \textcolor{lime}{ずんだもん:} おや?「キーボードから1文字入力して下さい」と表示されたまま止まってしまったのだ

\footnotesize \textcolor{pink}{四国めたん:} はい、これはgetchar関数がコールされたのでキーボードからの入力を待っている状態ですわ

入力待ち

\footnotesize \textcolor{lime}{ずんだもん:} この状態でどうすればいいのだ?

\footnotesize \textcolor{pink}{四国めたん:} とりあえずキーボードで\fcolorbox{blue}{lightgray}{a}を入力してみましょう

\footnotesize \textcolor{lime}{ずんだもん:} お~、コンソールに"a"が表示されたのだ

\footnotesize \textcolor{pink}{四国めたん:} さらに\fcolorbox{blue}{lightgray}{Enter}キーを押すことでプログラムが再開されますわ

\footnotesize \textcolor{lime}{ずんだもん:} 「キーボードからの入力は"a"です」と表示されたのだ

\footnotesize \textcolor{pink}{四国めたん:} はい、こんな感じでキーボードからの入力を得られますわ

キーボードからaを入力

getchar関数の解説

\footnotesize \textcolor{pink}{四国めたん:} それでは各行の説明をしますわね

\footnotesize \textcolor{lime}{ずんだもん:} お願いするのだ

\footnotesize \textcolor{pink}{四国めたん:} まず、main関数内の最初の行は変数"c"の宣言と初期化ですわ

\footnotesize \textcolor{lime}{ずんだもん:} 0に初期化しているけど意味があるのか?

\footnotesize \textcolor{pink}{四国めたん:} 意味がないように見えますが、必ず何かの値で初期化するように習慣付けするのは良いことですわ

\footnotesize \textcolor{lime}{ずんだもん:} わかったのだ

\footnotesize \textcolor{lime}{ずんだもん:} とりあえずスルーしておくのだ

\footnotesize \textcolor{pink}{四国めたん:} 3行目でgetchar関数をコールしていますわ

\footnotesize \textcolor{pink}{四国めたん:} getchar関数の戻り値は int型 なので、 int型 の変数"c"に代入していますわ

\footnotesize \textcolor{pink}{四国めたん:} 最後にprintfで変数"c"の内容、つまりキーボードからの入力を表示していますわね

\footnotesize \textcolor{pink}{四国めたん:} ちなみに1文字を表示するための書式指定子は"%c"ですわ

\footnotesize \textcolor{lime}{ずんだもん:} なるほどなのだ

\footnotesize \textcolor{lime}{ずんだもん:} ところでprintf中の文字列の中の円文字"\small\yen"はなんなのだ?

\footnotesize \textcolor{pink}{四国めたん:} これは文字列の中でダブルクォーテーション(")や改行を表示したい場合に使いますわ

\footnotesize \textcolor{pink}{四国めたん:} 日本では円文字ですが英語圏ではバックスラッシュ"\small\backslash"として表記されますわね

\footnotesize \textcolor{lime}{ずんだもん:} どちらも同じとして扱っていいのか?

\footnotesize \textcolor{pink}{四国めたん:} その通りですわ

\footnotesize \textcolor{pink}{四国めたん:} そして円文字にダブルクォーテーション(\small\yen")ならダブルクォーテーション(")が表示されますわ

\footnotesize \textcolor{lime}{ずんだもん:} 円文字に"n"なら改行ということか?

\footnotesize \textcolor{pink}{四国めたん:} そのとおりですわ

エスケープシーケンス

C言語で円文字(\small\yen)もしくはバックスラッシュ(\small\backslash)と何かの文字を組み合わせて表す文字を エスケープシーケンス と言います

通常は、そのまま使用すると特別な意味になるような文字や表現できない文字等を表示するために使用します

この時、円文字(\small\yen)もしくはバックスラッシュ(\small\backslash)を エスケープ文字 と言います

サンプルコードでは文字列の中でダブルクォーテーション(")をそのまま使ってしまうと文字列がそこで終わることになってしまいます

また文字列中で改行を使いたい場合、キーボードで\fcolorbox{blue}{lightgray}{Enter}を入力しても、エディター上で改行されるだけで文字列として改行されるわけではありません

そうした場合に使用できるのが エスケープシーケンス です

なおC言語での基本的な エスケープシーケンスエスケープシーケンスを使って特殊文字を記述するで解説されています

特殊な エスケープシーケンス 等は【C言語】エスケープシーケンス チートシートが参考になります

Visual Studioで使える エスケープシーケンス についてはエスケープ シーケンスで解説されています

以下は エスケープシーケンス の一部です

エスケープシーケンス

エスケープシーケンス 意味
\a 警報音
\b バックスペース
\n 復帰改行
\r 復帰
\f 改ページ
\t 水平タブ
\v 垂直タブ
\\ 文字としての\
\? 文字としての?
\' シングルクォーテーション(')
\" ダブルクォーテーション(")
\0 Nul(ヌル)

まぁ、警告音(\a)やバックスペース(\b)は現在では余り使い道がありませんが…

ちなみにC言語以外でも エスケープシーケンス はありますが、プログラミング言語により仕様が異なりますので注意が必要です

2文字入力

\footnotesize \textcolor{lime}{ずんだもん:} ところでgetcharに2文字以上、入力したらどうなるのだ?

\footnotesize \textcolor{pink}{四国めたん:} やってみましょう

\footnotesize \textcolor{pink}{四国めたん:} 実行後に\fcolorbox{blue}{lightgray}{b},\fcolorbox{blue}{lightgray}{c}と入力して\fcolorbox{blue}{lightgray}{Enter}を押しますわ

\footnotesize \textcolor{lime}{ずんだもん:} 「キーボードからの入力は"b"です」と表示されたのだ

\footnotesize \textcolor{pink}{四国めたん:} この結果をみるとgetchar関数は最初の1文字のみを取得していますわね

\footnotesize \textcolor{lime}{ずんだもん:} なるほどなのだ

2文字入力

日本語入力

\footnotesize \textcolor{lime}{ずんだもん:} 英文字はいいとして日本語の文字の場合はどうなるのだ?

\footnotesize \textcolor{pink}{四国めたん:} それもやってみましょう

\footnotesize \textcolor{pink}{四国めたん:} 実行後に"あ"と入力して\fcolorbox{blue}{lightgray}{Enter}を押しますわ

日本語入力

\footnotesize \textcolor{lime}{ずんだもん:} あれ?「キーボードからの入力は"・です」と出力されたのだ

\footnotesize \textcolor{pink}{四国めたん:} はい、実はgetchar関数は日本語の入力に対応していません

\footnotesize \textcolor{pink}{四国めたん:} ですので動作がおかしくなってしまっていますわね

\footnotesize \textcolor{lime}{ずんだもん:} そうなのか。残念なのだ

\footnotesize \textcolor{pink}{四国めたん:} 日本語を扱うのは少し複雑なので、そのうちお話ししますわ

\footnotesize \textcolor{lime}{ずんだもん:} 期待しているのだ

_getch関数

\footnotesize \textcolor{lime}{ずんだもん:} ところでキーボードからの入力で、毎回\fcolorbox{blue}{lightgray}{Enter}を押すのは煩わしいのだ

\footnotesize \textcolor{lime}{ずんだもん:} 何とかならないのか?

\footnotesize \textcolor{pink}{四国めたん:} 標準関数ではないのですが\fcolorbox{blue}{lightgray}{Enter}を押さなくてもいい関数がありますわ

\footnotesize \textcolor{pink}{四国めたん:} Microsoftが独自に提供する_getchという関数がそれですわね

\footnotesize \textcolor{pink}{四国めたん:} さっそくプログラムを書いて実行してみましょう

#include <stdio.h>
#include <conio.h>

void main() {
  int c = 0;
  printf("キーボードから1文字入力して下さい\n");
  c = _getch();
  printf("キーボードからの入力は\"%c\"です\n", c);
}

\footnotesize \textcolor{lime}{ずんだもん:} 「キーボードから1文字入力して下さい」と表示されて止まったのだ

\footnotesize \textcolor{pink}{四国めたん:} はい、その状態でキーボードから\fcolorbox{blue}{lightgray}{a}を入力しますわね

改行なし

\footnotesize \textcolor{lime}{ずんだもん:} おっ!\fcolorbox{blue}{lightgray}{Enter}を押さなくても「キーボードからの入力は"a"です」と表示されたのだ

\footnotesize \textcolor{pink}{四国めたん:} はい、使い方はgetchar関数と一緒ですわ

\footnotesize \textcolor{lime}{ずんだもん:} わかりやすくて助かるのだ

_getch関数の解説

\footnotesize \textcolor{pink}{四国めたん:} _getch関数の使い方ですが、まずヘッダーファイル"conio.h"をインクルードしますわ

\footnotesize \textcolor{lime}{ずんだもん:} なるほど、_getch関数は"conio.h"ファイルの中で宣言されているのか

\footnotesize \textcolor{lime}{ずんだもん:} でも"conio.h"をインクルードしないとどうなるのだ?

\footnotesize \textcolor{pink}{四国めたん:} 実は"conio.h"をインクルードしなくても、ワーニングが出るだけで動作はしますわね

警告

\footnotesize \textcolor{pink}{四国めたん:} でもたまたま動いただけですわ

\footnotesize \textcolor{pink}{四国めたん:} それにいい作法ではないので、ヘッダーファイルはインクルードしましょうね

\footnotesize \textcolor{lime}{ずんだもん:} わかったのだ

\footnotesize \textcolor{lime}{ずんだもん:} ところで何でgetchではなく_getchとアンダースコアが前に付いているのだ?

\footnotesize \textcolor{pink}{四国めたん:} Visual Studio以外ではgetchとして提供している場合もあるようですわね

\footnotesize \textcolor{pink}{四国めたん:} ただMicrosoftは標準ではない関数にはアンダースコアを付けるのが定番のようですわ

\footnotesize \textcolor{lime}{ずんだもん:} なるほどなのだ

文字を入れる型char

\footnotesize \textcolor{pink}{四国めたん:} さて次は char型 について説明しますわね

\footnotesize \textcolor{lime}{ずんだもん:} おねがいなのだ

\footnotesize \textcolor{pink}{四国めたん:} getchar_getchの戻り値はキーボードの入力文字を表しprintfの中では"%c"で文字を表示していましたわ

\footnotesize \textcolor{lime}{ずんだもん:} でも戻り値の型はint、つまり整数値だったのだ

\footnotesize \textcolor{lime}{ずんだもん:} なのに文字を表しているのはおかしいのだ

\footnotesize \textcolor{pink}{四国めたん:} はい、それにはちょっとしたカラクリがあるのですわ

\footnotesize \textcolor{lime}{ずんだもん:} カラクリ?

\footnotesize \textcolor{pink}{四国めたん:} 実はコンピューターの世界では文字は数値と1:1で対応付けられているのですわ

\footnotesize \textcolor{pink}{四国めたん:} たとえば a は97に、 0 は48に対応していますわね

\footnotesize \textcolor{lime}{ずんだもん:} つまり整数値を"%c"で表示すれば対応した文字が表示されるということなのか?

\footnotesize \textcolor{pink}{四国めたん:} その通りですわ

\footnotesize \textcolor{lime}{ずんだもん:} どの数値がどの文字に対応しているのか、教えてほしいのだ

\footnotesize \textcolor{pink}{四国めたん:} わかりましたわ

\footnotesize \textcolor{pink}{四国めたん:} 大文字、小文字を含めたアルファベットと数字、記号等は0~127の整数に対応付けられていますわ

\footnotesize \textcolor{pink}{四国めたん:} その対応は アスキーコード表 として提供されていますわ

アスキーコード表

\footnotesize \textcolor{lime}{ずんだもん:} お~、判り易いのだ

\footnotesize \textcolor{lime}{ずんだもん:} でも日本語がないのだ

\footnotesize \textcolor{pink}{四国めたん:} 日本語は扱いが難しいので、そのうちお話ししますわ

\footnotesize \textcolor{lime}{ずんだもん:} ざんねんなのだ

¥と\

\footnotesize \textcolor{lime}{ずんだもん:} ところで今回0~127までの整数に割り当てられた文字を扱うのに int型 の変数を使っていたのだ

\footnotesize \textcolor{pink}{四国めたん:} そうですわね

\footnotesize \textcolor{lime}{ずんだもん:} かなり無駄なのだ

\footnotesize \textcolor{pink}{四国めたん:} 確かに int型 は通常では-2,147,483,648~2,147,483,647の範囲の整数を扱うことができますから

\footnotesize \textcolor{pink}{四国めたん:} ですのでC言語にはcharという-128~127、もしくは0~255の整数を扱う型が用意されていますわ

\footnotesize \textcolor{lime}{ずんだもん:} なるほど、 char型 なら0~127のアスキーコードに割り当てられた文字をちょうど扱うのに適当な大きさなのだ

\footnotesize \textcolor{pink}{四国めたん:} まあ、最初から文字を扱うために用意したのでしょうね

\footnotesize \textcolor{lime}{ずんだもん:} もしかしてchar文字 を表す"character"の省略形なのか?

\footnotesize \textcolor{pink}{四国めたん:} たぶんそうですわね

\footnotesize \textcolor{pink}{四国めたん:} というわけで実際に変数をintからcharに変更して実行してみましょう

#include <stdio.h>
#include <conio.h>

void main() {
  char c = 0;
  printf("キーボードから1文字入力して下さい\n");
  c = _getch();
  printf("キーボードからの入力は\"%c\"です\n", c);
}

\footnotesize \textcolor{lime}{ずんだもん:} 結果は変わらないのだ

\footnotesize \textcolor{pink}{四国めたん:} そうですわね

\footnotesize \textcolor{pink}{四国めたん:} ここでc = _getch();の後の行にブレークポイントをセットして実行してみましょう

\footnotesize \textcolor{lime}{ずんだもん:} 変数"c"に97という値が入っているのだ

Cの値

getcharの戻り値

\footnotesize \textcolor{lime}{ずんだもん:} ところでgetchar_getchの戻り値がintなのはなぜなのだ?

\footnotesize \textcolor{lime}{ずんだもん:} char型 でも問題ないのではないのか?

\footnotesize \textcolor{pink}{四国めたん:} そうなのですが、エラーが発生した時に負の整数を返すことを考慮していますわ

\footnotesize \textcolor{lime}{ずんだもん:} でも char型 でも-128まで負の整数を表せるはずなのに…

\footnotesize \textcolor{pink}{四国めたん:} 確かにVisual Studioでは-128~127の範囲を表せますわね

\footnotesize \textcolor{pink}{四国めたん:} でも別のシステムでは正の整数である0~255までを表すようになっている場合があるのですわ

\footnotesize \textcolor{lime}{ずんだもん:} いい加減なのだ

\footnotesize \textcolor{pink}{四国めたん:} その通りですが、決まり事なので、仕方がないですわ

\footnotesize \textcolor{lime}{ずんだもん:} なるほど、決まり事なら仕方がないのだ

まとめ

\footnotesize \textcolor{pink}{四国めたん:} お疲れさまでした

\footnotesize \textcolor{pink}{四国めたん:} 以上で char型とgetchar を終了しますわ

\footnotesize \textcolor{lime}{ずんだもん:} おつかれさまなのだ

Discussion