ページ 1 / 1
scanfを用いないint型の数字の入力を知りたい
Posted: 2017年7月08日(土) 13:26
by 遊び人
int型の変数にscanfで数字を入力する際、文字などを入れるとおかしくなってしまいます。
getchを使った場合は0~9の数字しか入力できない(もしかしたらあるのかもしれないですけど私は知らない)ので、
入力できる値に制限がなく、尚且つ文字を入力してもおかしくならないようにできる方法があれば教えてください!
コード:
#include <stdio.h>
int main()
{
int input;
while (1) {
scanf("%d", &input);
//もしinputが数字だった場合break、そうでない場合はループという処理にしたいです。
if (inputが数字) break;
}
printf("%d\n", input);
return 0;
}
Re: scanfを用いないint型の数字の入力を知りたい
Posted: 2017年7月08日(土) 17:26
by purin52002
こんにちは
いくつか方法を思いつきました。
一つは、入力を一度文字列で受け取り、数字に変換する方法です。
int型ですと、–2147483648から2147483648の数字を扱えます。
だから少なくとも12文字分の文字列を用意します。(符号とNULLのため)
入力を文字列で受け取ったら、まずは文字列が数字(と符号)だけでできているか確認します。
自分で処理を書くのが面倒だったら、isdigit関数を使えばいいと思います。(注:符号は判定してくれないらしい)
ここで文字列が数字だけでできていなかったらもう一度入力を促します。(do~whileとか使えばよさげ?)
文字列が数字だけでできていたら、atoi関数などでint型に変換します。
終わり
もう一つの方法は、getcharで一文字ずつ入力を受け付け、数字に変換していく方法です。
最初に数字を格納するデータ(suji)を0で初期化しておきます。
次に、getcharで入力された文字を数字か判定します。
数字だったらsujiを10倍して入力された数字を足し、それを新たなsujiとします。
あとはこれを入力が終わるまで繰り返します。
終わり
他にももっと頭のいい方法があるかもしれません^p^
Re: scanfを用いないint型の数字の入力を知りたい
Posted: 2017年7月08日(土) 18:53
by 遊び人
前者の方法で無事成功しました。
勉強になりました、ありがとうございます(´∀`)
こうしてみるとscanfって面倒くさいですね(´・ω・`)
コード:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
int main()
{
int value, n, i;
char input[12];
START:
printf("数字を入力\n");
scanf("%s", input);
n = strlen(input);
for (i = 0; i < n; i++) {
if (isdigit(input[i]) == 0 && input[i] != '+' && input[i] != '-') {
printf("文字は禁止です\n");
goto START;
}
}
value = atoi(input);
printf("%d\n", value);
return 0;
}
Re: scanfを用いないint型の数字の入力を知りたい
Posted: 2017年7月09日(日) 06:08
by かずま
遊び人 さんが書きました:前者の方法で無事成功しました。
勉強になりました、ありがとうございます(´∀`)
こうしてみるとscanfって面倒くさいですね(´・ω・`)
123+45 と入力されたら、value = 123 でいいんですか?
それもエラーにしたかったら、1行が読み込めて、
整数値が読み込めて、余計な文字がなければ、OK とする。
コード:
#include <stdio.h> // puts, fgets, sscanf, feof, printf, stdin
int main(void)
{
int value;
char input[1024], c;
while (puts("数字を入力\n"),
fgets(input, sizeof input, stdin) &&
sscanf(input, "%d %c", &value, &c) != 1)
puts("正しい数ではありません");
if (feof(stdin)) { puts("EOF"); return 1; }
printf("%d\n", value);
return 0;
}
Re: scanfを用いないint型の数字の入力を知りたい
Posted: 2017年7月09日(日) 12:41
by 遊び人
なるほど、今回は数字のみを入力することしか考慮していなかったので、そのパターンが頭から抜けておりました。
今後そちらのコードを採用させて頂きます。ありがとうございました。