int型の変数にscanfで数字を入力する際、文字などを入れるとおかしくなってしまいます。
getchを使った場合は0~9の数字しか入力できない(もしかしたらあるのかもしれないですけど私は知らない)ので、
入力できる値に制限がなく、尚且つ文字を入力してもおかしくならないようにできる方法があれば教えてください!
scanfを用いないint型の数字の入力を知りたい
- purin52002
- 記事: 235
- 登録日時: 7年前
- 連絡を取る:
Re: scanfを用いないint型の数字の入力を知りたい
こんにちは
いくつか方法を思いつきました。
一つは、入力を一度文字列で受け取り、数字に変換する方法です。
int型ですと、–2147483648から2147483648の数字を扱えます。
だから少なくとも12文字分の文字列を用意します。(符号とNULLのため)
入力を文字列で受け取ったら、まずは文字列が数字(と符号)だけでできているか確認します。
自分で処理を書くのが面倒だったら、isdigit関数を使えばいいと思います。(注:符号は判定してくれないらしい)
ここで文字列が数字だけでできていなかったらもう一度入力を促します。(do~whileとか使えばよさげ?)
文字列が数字だけでできていたら、atoi関数などでint型に変換します。
終わり
もう一つの方法は、getcharで一文字ずつ入力を受け付け、数字に変換していく方法です。
最初に数字を格納するデータ(suji)を0で初期化しておきます。
次に、getcharで入力された文字を数字か判定します。
数字だったらsujiを10倍して入力された数字を足し、それを新たなsujiとします。
あとはこれを入力が終わるまで繰り返します。
終わり
他にももっと頭のいい方法があるかもしれません^p^
いくつか方法を思いつきました。
一つは、入力を一度文字列で受け取り、数字に変換する方法です。
int型ですと、–2147483648から2147483648の数字を扱えます。
だから少なくとも12文字分の文字列を用意します。(符号とNULLのため)
入力を文字列で受け取ったら、まずは文字列が数字(と符号)だけでできているか確認します。
自分で処理を書くのが面倒だったら、isdigit関数を使えばいいと思います。(注:符号は判定してくれないらしい)
ここで文字列が数字だけでできていなかったらもう一度入力を促します。(do~whileとか使えばよさげ?)
文字列が数字だけでできていたら、atoi関数などでint型に変換します。
終わり
もう一つの方法は、getcharで一文字ずつ入力を受け付け、数字に変換していく方法です。
最初に数字を格納するデータ(suji)を0で初期化しておきます。
次に、getcharで入力された文字を数字か判定します。
数字だったらsujiを10倍して入力された数字を足し、それを新たなsujiとします。
あとはこれを入力が終わるまで繰り返します。
終わり
他にももっと頭のいい方法があるかもしれません^p^
c++初心者を自負しています。
質問者さんには今後私にプログラミングを教えてくれるようにやさしく丁寧に教えるつもりです。ぎぶあんどていく^p^
回答者さんには精一杯感謝します。ぎぶおんりー^p^
質問者さんには今後私にプログラミングを教えてくれるようにやさしく丁寧に教えるつもりです。ぎぶあんどていく^p^
回答者さんには精一杯感謝します。ぎぶおんりー^p^
Re: scanfを用いないint型の数字の入力を知りたい
前者の方法で無事成功しました。
勉強になりました、ありがとうございます(´∀`)
こうしてみるとscanfって面倒くさいですね(´・ω・`)
勉強になりました、ありがとうございます(´∀`)
こうしてみると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型の数字の入力を知りたい
123+45 と入力されたら、value = 123 でいいんですか?遊び人 さんが書きました:前者の方法で無事成功しました。
勉強になりました、ありがとうございます(´∀`)
こうしてみるとscanfって面倒くさいですね(´・ω・`)
それもエラーにしたかったら、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型の数字の入力を知りたい
なるほど、今回は数字のみを入力することしか考慮していなかったので、そのパターンが頭から抜けておりました。
今後そちらのコードを採用させて頂きます。ありがとうございました。
今後そちらのコードを採用させて頂きます。ありがとうございました。