1ヶ月でWebデザイン・プログラミングスキルをオーダーメイドのカリキュラムで学べるスクール、それがWebCamp。

子供の想像力を伸ばしアイデアを形にする小学生向けプログラミング教室「プロスタキッズ」

【C言語超入門(第27回)】入出力の方法を学ぼう(文字列の入出力編)

Pocket

キーボードから文字列を一行単位で入力したりディスプレーに出力したりといった入出力処理を行うために、
C言語にはgets関数とputs関数が用意されています。

今回のC言語超入門では、キーボードから一行の文字列を入力する gets 関数と 、ディスプレーに一行の文字列を出力するputs 関数の使い方について解説していきます。

なお、一行単位ではなく、1文字単位で入出力をしたい場合は、getchar関数、putchar関数を用います。

getchar関数、putchar関数の使い方については、C言語超入門(第26回)で解説していますので、参考にしてくださいませ。

一行の文字列を入出力するサンプルプログラム

以下のプログラム1は、キーボードから一行の文字列を入力し、そのままディスプレイに出力するプログラムです。

キーボードからの入力にはgets関数を、ディスプレイへの出力にはputs関数を用いています。

 

キーボードから文字列を一行入力するgets関数

gets関数はキーボードから文字列を一行入力する関数で、gets関数の引数に指定した文字配列にキーボードから入力された文字列が格納されます。

getsは、キーボードから入力された文字をreturnキーが入力されるまで取得するため、
プログラム1の実行結果ように、文字列の途中に記号や空白文字があっても取得できることがポイントです。

なお、gets関数の引数として使用する配列長は、入力される文字列の長さを想定して十分な長さを確保しなければなりません。

プログラム1では文字配列長を15としていますが、もし入力される文字列が「hallo, everyone.」になっただけで、すぐにオーバーしてしまいます。

このように、あらかじめ想定した配列長を超えてしまうことを、バッファーオーバーランといい、
プログラムの異常終了や、意図しないプログラムを実行してしまうというセキュリティ上の問題が発生してしまいます。

ですから、実際には100や200といった十分な配列長を用いるようにします。

実は、ここで挙げた100や200という数値には根拠がある数値ではなく、これくらいの配列長があれば十分に余裕があるだろう、という推測によるものです。

もし配列長を決めかねるときは、BUFSIZ というC言語のマクロを用いて以下のように配列を宣言するのも一つの方法です。

BUFSIZの大きさは開発環境によって異なりますが、C言語の規格で 256以上であることが定められており、
一般的に512から8192の範囲になることが多いようです。

以下のプログラム2を実行することで、お使いの開発環境におけるBUFSIZの大きさを調べることができますので、ご参考まで。

 

ただし、いくら十分な配列長を設定したとしても、gets関数を使用している限り、
完全にバッファーオーバーランを回避することができません。

なぜなら、gets関数には入力する文字長を制限することができないため、どんなに長い文字列であっても受け付けてしまうためです。

ですから、gets関数を利用するにあたっては、
バッファーオーバーランが発生する可能性がある、ということを理解した上で使用してください。

キーボードから文字列を一行入力するputs関数

puts関数はgets関数と逆に文字列を出力する関数で、
puts関数の引数に指定した文字配列のデータがディスプレーに出力されます。

puts関数が持つ最大のポイントは、文字列を出力した後に改行が自動的に行われる、ということです。

文字列を出力する方法の一つとしてprintf関数がありますが、printf関数は書式を指定して改行を明記しなければなりません。

逆にputs関数は書式指定は一切不要でシンプルに出力することが出来ますが、
出力する文字列は強制的に改行され、改行することを止めることができない、というデメリットがあります。

書式を指定して出力をしたいときはprintf関数を、書式の指定が必要ない場合はputs関数を使うと良いでしょう。

C言語超入門の第27回まとめ

今回のC言語超入門では、文字列を一行入出力する標準関数のgets関数とputs関数の使い方について、お伝えいたしました。

最後にgets関数とputs関数のポイントをまとめておきます。

・gets関数の引数に指定した文字配列に、キーボードから入力された文字列がenterキーが入力されるまで格納される
・gets関数に使用する配列長は、十分な長さを確保しておかないと、バッファーオーバランを引き起こす
・puts関数で文字列を出力すると自動で改行される

ステップ・バイ・ステップ。焦らず一歩ずつ進んでいきましょう。

投稿者:プロスタ編集部

  • このエントリーをはてなブックマークに追加
  • follow us in feedly

プログラミングで挫折しそうなら、現役エンジニアにマンツーマンで相談してみませんか?オンラインのプログラミングスクール「TechAcademy」のメンターが対応。

この記事が気に入ったら
いいね!しよう

プロスタの最新情報をお届けします

あわせて読みたい

関連記事

ページ上部へ戻る