C言語-インタプリタminiCASL |
1. メニュープログラムは言語処理プログラムの基本 (2)
キーボード入力scanf()とgets()
キーボードからのデータ入力に関数scanfを使用している。入力データはすべて整数であり、整数が入力されるものとしてプログラミングしている。例えば、入力データとして文字を入力すると、このプログラムは暴走する可能性がある(暴走したときはCTRL+Cで中断)。
これは、関数scanfの引数に%dを指定しているので、入力データが10進整数でなければ入力データを無視して未知の数値を返す。入力データはバッファと呼ばれる領域に残ったままなので、次の関数scanfがその入力データを取り込もうとするが、入力データは10進整数ではないので入力データを無視して未知の数値を返す。これが繰り返されるからである。(キーボードなどから入力されたデータは、一度、バッファと呼ばれる領域に記憶される。)
解決方法の一例として、数値も文字として入力した後、数値に変換する。
変換 | scanf("%d", &data1); → | gets(buff); データを文字列として入力 data1 = atoi(buff); 文字列を整数に変換 |
入力データを関数getsで文字列として入力するので、入力データは必ず変数buffに格納される。変数buffは、char型配列として宣言しておく(例:char
buff[80];)。
関数atoiは文字列を整数に変換する関数である。ただし、数字以外の文字の場合は、0を返す。同じように文字列を実数に変換する関数atofもある。いずれも #include <stdlib.h> が必要である。
次に、入力に関数getsを使い、さらに実数(double型)の計算ができるように変更する。
[mc03.c] (プログラムリスト中の\は\と同じ) | |
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 30: 31: 38: 39: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: |
#include <stdio.h> #include <stdlib.h> void main(void) { int num; @ data1, data2, ans; A buff[80]; while(1){ printf(" 1.ADD\n 2.SUB\n 3.MUL\n 4.DIV\n 0.END\n"); printf("\n Number : "); gets(buff); num = atoi(buff); if(num == 1){ /* 計算処理 */ printf("Data1 : "); B ; /* 文字列入力 */ C ; /* 実数値に変換 */ printf("Data2 : "); D ; /* 文字列入力 */ E ; /* 実数値に変換 */ ans = data1 + data2; }else if(num == 2){ <<赤色の部分(16〜21行)と同じ>> ans = data1 - data2; }else if(num == 3){ <<赤色の部分(16〜21行)と同じ>> ans = data1 * data2; }else if(num == 4){ <<赤色の部分(16〜21行)と同じ>> ans = data1 / data2; }else if(num == 0){ break; }else{ printf("Error : Number 0 - 4\n"); continue; } printf("Answer = %f\n\n", ans); /* 結果表示 */ } } |
1.ADD 2.SUB 3.MUL 4.DIV 0.END Number : 1 Data1 : 12.34 Data2 : 11.11 Answer = 23.450000 1.ADD 2.SUB 3.MUL 4.DIV 0.END Number : 0 |
Copyright © 2001 Hiroshi Masuda |