<HTML>
<!-- QCC Converter for HTML 苦C Style Ver 1.00 -->
<HEAD>

<META http-equiv="Content-Type" content="text/html; charset=Shift_JIS">

<link rel="alternate" media="handheld" href="m/index.html" />
<TITLE>入力の恐怖</TITLE>

<LINK REL="stylesheet" TYPE="text/css" HREF="c_def.css">
<LINK REL="stylesheet" TYPE="text/css" HREF="f_gothic.css">
<LINK REL="stylesheet" TYPE="text/css" HREF="s_middle.css">
<LINK REL="stylesheet" TYPE="text/css" HREF="c.css">
<LINK REL="stylesheet" TYPE="text/css" HREF="myad.css">
<SCRIPT language="JavaScript" src="chstyle.js" type="text/javascript"></SCRIPT>
<SCRIPT language="JavaScript" src="textmenu.js" type="text/javascript"></SCRIPT>
<LINK REL="CONTENTS" HREF="index.html">
<LINK REL="PREVIOUS" HREF="06-01.html">
<LINK REL="NEXT" HREF="06-q.html">

</HEAD>

<script type="text/javascript">
var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www.");
document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E"));
</script>
<script type="text/javascript">
try {
var pageTracker = _gat._getTracker("UA-7801054-2");
pageTracker._trackPageview();
} catch(err) {}</script>
<!--スタイルシート未対応ブラウザ用-->
<BODY BGCOLOR="#E3DFD4" BACKGROUND="back.png"
TEXT="#201000" LINK="#0000FF" VLINK="#800080" ALINK="#FF0000">
<STYLE>
<FONT SIZE=2>※スタイルシート未対応ブラウザではレイアウトを正確に再現できません。</FONT><BR>
</STYLE>

<!--移動ミニメニュー-->
<DIV ID="TextMenu" CLASS="BOX" STYLE="position:absolute;top:40;left:10;">
&nbsp;
<a href="06-01.html"><戻る</A>&nbsp;
<a href="index.html">目次</A>&nbsp;
<a href="06-q.html">進む></A>
&nbsp;
</DIV>

<DIV STYLE="position:absolute;top:8;left:10;">
<form action="http://www.google.co.jp/cse" id="cse-search-box" target="_blank">
  <div>
    <input type="hidden" name="cx" value="partner-pub-9540206480671607:26vf4ivohvg" />
    <input type="hidden" name="ie" value="Shift_JIS" />
    <input type="text" name="q" size="8" />
    <input type="submit" name="sa" value="&#x691c;&#x7d22;" />
  </div>
</form>
<script type="text/javascript" src="http://www.google.co.jp/cse/brand?form=cse-search-box&amp;lang=ja"></script>
</div>
<!--ミニナビゲーションバー-->

<FONT SIZE="2">
<a href="06-01.html"><戻</A>
<a href="06-q.html">進></A>
</FONT>
<!--全ページ共通のスタイル変更ボタン-->
<NOBR>
<FONT SIZE="2" CLASS="BOX">

<a href="#NULL" ONMOUSEDOWN="StyleChange('COLOR','c_def.css')">雑誌</A>
<a href="#NULL" ONMOUSEDOWN="StyleChange('COLOR','c_mono.css')">白黒</A>
<a href="#NULL" ONMOUSEDOWN="StyleChange('COLOR','c_high.css')">明暗</A>
</FONT>
&nbsp;
<FONT SIZE="2" CLASS="BOX">
フォント
<a href="#NULL" ONMOUSEDOWN="StyleChange('FONT','f_default.css')">既定</A>
<a href="#NULL" ONMOUSEDOWN="StyleChange('FONT','f_gothic.css')">ゴシック</A>
<a href="#NULL" ONMOUSEDOWN="StyleChange('FONT','f_ming.css')">明朝</A>
<a href="#NULL" ONMOUSEDOWN="StyleChange('FONT','f_hand.css')">手書き</A>
</FONT>
&nbsp;
<FONT SIZE="2" CLASS="BOX">
サイズ
<a href="#NULL" ONMOUSEDOWN="StyleChange('SIZE','s_small.css')">小</A>
<a href="#NULL" ONMOUSEDOWN="StyleChange('SIZE','s_middle.css')">中</A>
<a href="#NULL" ONMOUSEDOWN="StyleChange('SIZE','s_big.css')">大</A>
</FONT>
&nbsp;
<FONT SIZE="2" CLASS="BOX">
<a href="#NULL" ONMOUSEDOWN="StyleReset()">標準</A>
</FONT>
&nbsp;
<P>
<script type="text/javascript"><!--
google_ad_client = "pub-9540206480671607";
/* 728x90, 作成済み 09/03/10 */
google_ad_slot = "2107951220";
google_ad_width = 728;
google_ad_height = 90;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>
<iframe src="http://www.facebook.com/plugins/like.php?href=http://9cguide.appspot.com/06-02.html;layout=standard&amp;show_faces=true&amp;width=450&amp;action=like&amp;colorscheme=light&amp;height=80" scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:450px; height:80px;" allowTransparency="true"></iframe>
</P>
<!--タイトル-->
<HR CLASS="TEXT">
<FONT SIZE="6" COLOR="#000000">
<DIV CLASS="MAINTITLE"><B><CENTER>&nbsp;&nbsp;
入力の恐怖
&nbsp;&nbsp;</CENTER></B></DIV></FONT>

<!--目次-->
<HR CLASS="TEXT">
<FONT SIZE="4">
<OL><BLOCKQUOTE><A NAME="CONTENTS"> </A>
<LI><FONT SIZE="5" CLASS="CONTENTS"><a href="#S1">第1項:恐怖の入力ミス</FONT></A>
<LI><FONT SIZE="5" CLASS="CONTENTS"><a href="#S2">第2項:区切り記号のミス</FONT></A>
<LI><FONT SIZE="5" CLASS="CONTENTS"><a href="#S3">第3項:大きすぎる数値</FONT></A>
<LI><FONT SIZE="5" CLASS="CONTENTS"><a href="#S4">第4項:文字列の恐怖</FONT></A>
<LI><FONT SIZE="5" CLASS="CONTENTS"><a href="#S5">第5項:解決法について</FONT></A>
</A></OL></BLOCKQUOTE>

<HR CLASS="TEXT">
<FONT COLOR="#000099" SIZE="4" CLASS="TITLE"><B><A NAME="S1">
[1]恐怖の入力ミス
</A></B></FONT>
<FONT SIZE="3" CLASS="TEXT"><P>
もしかしたら、筆者は相当なひねくれ者なのかもしれません。<BR>
前節では良いプログラムの見本のように紹介しておきながら、<BR>
これから、そのプログラムには、問題があると文句をつけるつもりでいるからです。<BR>
<P>
一体、先ほどのプログラムのどこに問題があったのでしょうか?<BR>
実は、<FONT COLOR="#990000" CLASS="EM"><B>scanf関数を使用していること</B></FONT>が問題なのです。<BR>
<P>
scanf関数は、色々な問題を抱えている関数です。<BR>
入門書では比較的良く使われるにもかかわらず、本格的な開発では使われません。<BR>
会社(学校)によっては、<FONT COLOR="#990000" CLASS="EM"><B>scanf関数禁止令</B></FONT>を出していることもあります。<BR>
<P>
しかし、先ほど作ったプログラムは、特に問題なく動作していました。<BR>
一体、どこに問題があるのか・・・・、それは、<FONT COLOR="#990000" CLASS="EM"><B>入力ミス</B></FONT>です。<BR>
<P>
正しく使っている限り、scanf関数は特に問題を引き起こしませんが、<BR>
入力ミスがあった場合、とたんに恐ろしい問題を引き起こすことがあります。<BR>
これから、先ほどのプログラムを題材に、入力ミスのケースを紹介していきます。<BR>
</P></FONT>
<FONT SIZE="5" CLASS="CONTENTS"><B><CENTER><a href="#CONTENTS">目次に戻る</A></CENTER></B></FONT>
<BR>

<HR CLASS="TEXT">
<FONT COLOR="#000099" SIZE="4" CLASS="TITLE"><B><A NAME="S2">
[2]区切り記号のミス
</A></B></FONT>
<FONT SIZE="3" CLASS="TEXT"><P>
まずは起こりそうな例として、<FONT COLOR="#990000" CLASS="EM"><B>区切り記号を打ち間違えてみます</B></FONT>。<BR>
先ほどのプログラムでは、,で区切るようになっていましたが、<BR>
これをあえて無視して、スペースで区切ってみたいと思います。<BR>
<P>
次は、区切り記号を打ち間違えた場合の実行結果です。<BR>
<BLOCKQUOTE CLASS="BOX">
<IMG SRC="screen.png" STYLE="position:relative;top:-10px;"><BR>
最小値と最大値を , で区切って入力して下さい。:100 200<BR>
100~307 の合計は 9560 です。<BR>
</BLOCKQUOTE>
始めに入力した 100 の方は正常に入力されているようなのですが、<BR>
後の 200 の方は、何故か 307 などという数値になってしまっています。<BR>
<P>
この結果は、使用するコンパイラによって異なってくるので、<BR>
皆さんが実行させてみた場合は、別の結果が出てくるのかもしれません。<BR>
</P></FONT>
<FONT SIZE="5" CLASS="CONTENTS"><B><CENTER><a href="#CONTENTS">目次に戻る</A></CENTER></B></FONT>
<BR>

<HR CLASS="TEXT">
<FONT COLOR="#000099" SIZE="4" CLASS="TITLE"><B><A NAME="S3">
[3]大きすぎる数値
</A></B></FONT>
<FONT SIZE="3" CLASS="TEXT"><P>
<P>
<script type="text/javascript"><!--
amazon_ad_tag = "9cguide-22"; amazon_ad_width = "728"; amazon_ad_height = "90"; amazon_ad_logo = "hide"; amazon_ad_link_target = "new";//--></script>
<script type="text/javascript" src="http://www.assoc-amazon.jp/s/ads.js"></script>
</P>
次に、<FONT COLOR="#990000" CLASS="EM"><B>極端に大きな数値</B></FONT>を入力させてみたいと思います。<BR>
なお、最近のコンパイラはかなり大きな数値でも入力出来てしまうので、<BR>
これを自分で試す場合は、16ビットコンパイラ(LSI C-86)を使って下さい。<BR>
<P>
次は、大きすぎる数値を入力した場合の実行結果です。<BR>
<BLOCKQUOTE CLASS="BOX">
<IMG SRC="screen.png" STYLE="position:relative;top:-10px;"><BR>
最小値と最大値を , で区切って入力して下さい。:1,70000<BR>
1~4464 の合計は 4408 です。<BR>
</BLOCKQUOTE>
70000 を入力したはずなのに、何故か 4464 と認識されてしまっています。<BR>
しかも、答えまで、1~4464 の合計値にしては、どう考えても小さすぎます。<BR>
<P>
これらは、記憶出来る範囲の限界を超えてしまったために起こる問題です。<BR>
入力のチェックをしようにも、入力された変数自体に 4464 と代入されているので、<BR>
4464 を入れたかったのか、打ち間違えて 4464 になったのかの区別が出来ません。<BR>
</P></FONT>
<FONT SIZE="5" CLASS="CONTENTS"><B><CENTER><a href="#CONTENTS">目次に戻る</A></CENTER></B></FONT>
<BR>

<HR CLASS="TEXT">
<FONT COLOR="#000099" SIZE="4" CLASS="TITLE"><B><A NAME="S4">
[4]文字列の恐怖
</A></B></FONT>
<FONT SIZE="3" CLASS="TEXT"><P>
<P>
<script type="text/javascript"><!--
google_ad_client = "pub-9540206480671607";
/* 728x90, 作成済み 09/03/10 */
google_ad_slot = "2107951220";
google_ad_width = 728;
google_ad_height = 90;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>
</P>
更に天邪鬼な実験をしてみたいと思います。<BR>
すなわち、数値を入力しろと言われているのに、<FONT COLOR="#990000" CLASS="EM"><B>文字列を入力</B></FONT>してみるのです。<BR>
<P>
次は、文字列を入力した場合の実行結果です。<BR>
<BLOCKQUOTE CLASS="BOX">
<IMG SRC="screen.png" STYLE="position:relative;top:-10px;"><BR>
最小値と最大値を , で区切って入力して下さい。:ABCDEF<BR>
11975~307 の合計は -16199 です。<BR>
</BLOCKQUOTE>
もはやめっちゃくちゃです。どうしてこうなったのかは、筆者にもわかりません。<BR>
11957 とか 307 とかの数値はどこから出てきたのでしょうか?<BR>
当然、この数値自体が入力されたのか、入力ミスなのかは判別出来ません。<BR>
<P>
皆さんは、まさかこんなマヌケなミスを犯す人はいないと考えるかもしれませんが、<BR>
寝ぼけているかもしれませんし、ペットの猫がキーボードを踏みつけるかもしれません。<BR>
更に困ったことに、<FONT COLOR="#990000" CLASS="EM"><B>ウイルスやハッカーがこの様な入力をする</B></FONT>ことがあります。<BR>
もし、大企業や政府で使われているプログラムでこんな事態が起こったら・・・。<BR>
</P></FONT>
<FONT SIZE="5" CLASS="CONTENTS"><B><CENTER><a href="#CONTENTS">目次に戻る</A></CENTER></B></FONT>
<BR>

<HR CLASS="TEXT">
<FONT COLOR="#000099" SIZE="4" CLASS="TITLE"><B><A NAME="S5">
[5]解決法について
</A></B></FONT>
<FONT SIZE="3" CLASS="TEXT"><P>
<P>
<script type="text/javascript"><!--
google_ad_client = "pub-9540206480671607";
/* 728x90, 作成済み 09/03/10 */
google_ad_slot = "2107951220";
google_ad_width = 728;
google_ad_height = 90;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>
</P>
散々色々な入力ミスを見せられて、もういい加減に疲れたかもしれません。<BR>
そろそろ、解決策を提示しないと、皆さんもうんざりしてしまうでしょう。<BR>
<P>
しかし、実は、この問題の<FONT COLOR="#990000" CLASS="EM"><B>解決は簡単ではありません</B></FONT>。<BR>
少なくとも、現在のあなたの知識では、これを解決することは出来ません。<BR>
解決策は、文字列として入力させて、そのデータを解析する方法が一般的です。<BR>
つまり、この問題を解決には、文字列処理の方法を知らなくてはなりませんが、<BR>
現在のあなたの知識では、文字列処理を行うことは出来ないのです。<BR>
<P>
この問題の解決手段は、ずっと後になってから紹介することにします。<BR>
それまでは、仕方がないので、scanf関数を使い続けるしかありません。<BR>
その間は、くれぐれも入力ミスには気をつけるようにして下さい。<BR>
</P></FONT>
<FONT SIZE="5" CLASS="CONTENTS"><B><CENTER><a href="#CONTENTS">目次に戻る</A></CENTER></B></FONT>
<BR>

<!--コラム共通の戻る-->
<CENTER><FONT SIZE="5" CLASS="CONTENTS"><B>
<HR CLASS="TEXT">
<a href="06-01.html"><-前に戻る</A>&nbsp;
<a href="index.html">先頭に戻る</A>&nbsp;
<a href="06-q.html">次へ進む-></A>
</B></DIV></FONT></CENTER>
</FONT>
</BODY>
</HTML>

inserted by FC2 system