C 基本講座

標準入力関数でキーボード入力を行う

LinkedInラーニングの無料トライアルを今すぐ試そう

無料で視聴する すべての加入プランを見る
このレッスンでは、標準入力関数で、キーボードからデータを入力する方法について説明します。
講師:
09:36

字幕

このレッスンでは、標準入力関数でキーボードからデータを入力する方法について説明します。標準入力は通常キーボードですが、キーボードからデータを入力するために主にこのような標準入力関数が用意されています。1文字を入力する getchar、文字列を入力する gets、そして書式付きで入力を行うscanf です。これらの標準入力関数を使用するのには、stdio.h の include が必要です。これらの関数の中で一番利用するされるのはscanf 関数でしょう。scanf は書式を指定することでいろいろな形式でデータを入力することができます。例えば int 型の変数 a に値を 10 進数で入力するのには%d 変換指定を使用します。実行してみましょう。このように 123 と入力するとa=123 と scanf の次の行の printf で入力した値を確認することができますね。この %d を %x にすると16 進数を入力することができます。また %o にすると8 進数を入力することができます。scanf の変換指定はこのようなものです。ほとんど printf 関数の変換指定と同じですがw 型の変換指定は%f ではなく %lf になるので注意してください。 また、もしここに a のように記述すると、入力するときに a =123 と入力しないとうまく入力ができなくなってしまいます。実は scanf はこの書式文字列に記述した内容をすべて入力する必要があります。ですから、書式文字列中には変換指定以外は書かない方がいいでしょう。これは元に戻しておきます。次に scanf の前にprintf を1文追加してみます。実行してみましょう。すると printf を表示していません。このまま 123 と入力するとprintf の表示に続けて入力値を表示しています。実は Windows 版 matrix ではprintf の後に来る scanf はバッファーに出力が貯められてしまい正しく動作しないようです。そのため回避策としてprintf 関数よりも前にsetvbuff 関数を追加してください。この文でバッファーを使用しなくなります。なお、Mac 版 matrix を使用している方は追加の必要はありません。ではもう一度実行してみましょう。今度は printf の表示をしますね。正常に入力もできました。さてこの変数の前の & ですが、これはアドレス演算子と呼ばれ、変数のアドレスを取得する演算子です。 scanf では書式文字列の後ろの引数にポインター、つまり簡単に言うと入力したデータを格納するアドレスを指定します。ですからこのように &a と記述します。ただしこのように文字型配列に %s 指定で文字列を入力するように指定した場合には& はつけません。この場合、配列名だけで配列の先頭要素のアドレスを示すからです。実行してみましょう。このように文字列の入力もできますね。またこのように記述すると、実は scanf がうまく入力できません。この上の部分をコメントで伏せて実行してみたいと思います。まず「整数値を入力してください」ということで 123 を入力すると、このまま文字を入力することができずに次の整数値を入力するようになってしまいます。実は scanf 関数ではキーボードから入力された値はバッファーと呼ばれる作業領域にいったん読み込まれEnter キーが入力されるとフラッシュされます。このフラッシュ時に改行を入力バッファーに残してしまうのです。そして %d の次のこの %c でその改行を文字として入力してしまいます。ですからユーザーがキーボードから入力することができなくなってしまうのです。 この ch の 10 は改行コードの 10 です。回避方法はいろいろありますが、一番簡単なのはこの % の前に半角スペースを1文字入れることです。このようにすると、scanf は改行を読み飛ばしてくれます。今度は文字を入力することができるようになります。この部分はまたコメントで伏せておきます。さて、今度は入力最大フィールド幅の指定についてお話しましょう。今このキャラクター型の配列は10 バイトです。ここに %s の変換指定で文字列を入力しようとすると何文字でも入力することができます。けれども 10 バイトですから文字列は最後に NULL 文字が付くことを考えると9 文字しか入力することができません。ですからそれ以上入力をしようとすると配列が壊されてしまいます。配列を壊さないためにここに入力フィールド幅を指定してください。このように 9 と記述してやると9 文字を超えて入力することができなくなります。実行してみましょう。今 15 文字を入力してみましたが、実際に入力できるのはこのように 9 文字になります。では次にもう一度入力して今度は ab cd ef と入力してみます。すると、実際に入力されたのはab だけになっています。 実は scanf はスペースや改行のような空白類文字を区切り文字として扱うため、スペースを入力データに含むことができません。スペースを含む文字列を入力するのには標準入力関数の gets が使えます。ただしこの gets は入力文字数を制限する方法がなく、格納配列を壊す可能性があります。そのため、あまり使われません。代わりに使われるのはfgets です。fgets はファイルから文字列を入力する関数ですが、ファイルにこの stdin、この標準入力を指定してこのように書くと、配列 str2 にstr2 のサイズを超えない範囲でキーボードから文字列を入力することができます。ただし fgets は入力バッファーの中の改行を読み込むのでscanf が残した改行を読み込んでしまうのでscanf の後に使う場合には注意が必要です。また入力文字列の中に改行を含む点にも注意してください。では実行してみましょう。このようにスペース区切りに入力しても、今度はきちんと入力することができました。最後に1文字入力のgetchar ですが、このように使用します。getchar は引数のない関数です。そして入力した文字をINT 型で返します。 実行してみましょう。実行するとこのように1文字だけを入力します。このレッスンでは、標準入力関数でキーボードからデータを入力する方法について説明しました。

C 基本講座

C言語はUNIXというOSを記述するために開発されたプログラミング言語で、組み込みシステムの開発を中心に今も使われています。このコースでは簡単なプログラムを作成しながら、C言語の基本的な文法を学びます。データ型や制御文などの基礎的な文法からポインタや構造体といったC言語の特徴的な内容まで幅広く取り上げます。よく使われる標準ライブラリ関数も数多く紹介します。

5時間45分 (60 ビデオ)
現在、カスタマーレビューはありません…
ソフトウェア・トピック
プラン加入者限定
発売日:2017年11月05日

このコースは、「オンデマンド」でご利用可能であり、ダウンロードすることもオンラインで見ることもできます。

ダウンロードすると、オフラインでコースを使用し、豊富なインターフェースをフルに活用できます。複数のデバイスを使用したり、 一度に全コースをダウンロードしたくない場合は、アカントにログインして、ストリーミング・ビデオとしてコースのレッスンを視聴してください。

ビデオトレーニングをお楽しみいただけますように! お問い合わせは、cs-jp@lynda.com宛までご連絡ください。