キーボード

C言語初心者学習記Part8

Scanfは危ないらしい…

前回のC言語初心者学習記Part7では謎のジャンケンゲーム(仮)を書き殴って終了しました。

 

今回からはその内容について、チマチマ解説していきます。

よろしければ、前回のPart7のソース全文と合わせてどうぞ。

 

↓私の稚拙なソース全文はコチラ↓

C言語初心者学習記Part7

 

この記事で触れる内容は、サブタイトルの通り、scanfについてです。

scanfによる誤入力を防止する

私の作ったジャンケンゲーム(仮)ではプレイヤーにだす手を要求する必要があります。

ド初心者の私は先ずscanfが思い浮かべましたが駄目なようです。

一応、このジャンケンゲーム(仮)ではプレイヤーにグーチョキパ―の選択肢を数字で与えて「その数字を半角で」打ってもらうように促しています。

 

…しかし、相手は人間ですから突拍子のないことをするかもしれません。

 

例えば、入力画面で「0」や「4」等の想定されていない数字を入れたり、「(´・ω・`)」や「(`・ω・´)」を入れてくる輩がいるかもしれません…

その前にそんなジャンケンゲーム()しないわ!って言うのはさておき…

 

とにかく、scanfでは意図しない数字や文字列などに対応できず読み込んでしまうそうです。

すると、バグの原因になったりします。

 

解決策

そこで多くの場合は、ユーザからの入力を一度文字列として入れて数値に変換するそうです。

今回の私のジャンケンゲーム(仮)にも採用しました。

ソースの29~33行目のところですね。

fgets関数で一度文字列として入力を受け付け、atoi関数で数値のみを取り出すといった感じです。

※このatoi関数にも問題点はあるらしいのですがとりあえずは無視で…

 

この方法を応用すると入力する文字数を制限してメモリの破壊を防ぐこともできるそうです。

例えば、ユーザーに文字を入力してもらう場面。

入力画面でユーザーには全角4文字でお願いします。

しかし、「あああああ」や「もょもとぅ」等と入力するかもしれません。

面白半分にキーボードのAを長押しされたらたまったものではありません。

そこで、あらかじめ打てる文字数を制限させます。

↓こんな感じ↓

#include <stdio.h>

int main(void)
{
	char str[9];
	printf("名前を入れてね!\n全角4文字、半角8文字までok\n");
	fgets(str,sizeof(str),stdin);
	printf("こんにちは!%s!\n",str);
}

これで、こんな感じになります。


c-8-0 c-8-1c-8-2

容赦なく切り捨ててますねw


 

【前→C言語初心者学習記 part7

【後→C言語初心者学習記 part9】


0

コメントを残す

メールアドレスが公開されることはありません。

CAPTCHA