scanfを用いないint型の数字の入力を知りたい

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
遊び人
記事: 42
登録日時: 3年前

scanfを用いないint型の数字の入力を知りたい

#1

投稿記事 by 遊び人 » 3年前

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;
}

アバター
purin52002
記事: 235
登録日時: 4年前
連絡を取る:

Re: scanfを用いないint型の数字の入力を知りたい

#2

投稿記事 by purin52002 » 3年前

こんにちは

いくつか方法を思いつきました。

一つは、入力を一度文字列で受け取り、数字に変換する方法です。

int型ですと、–2147483648から2147483648の数字を扱えます。
だから少なくとも12文字分の文字列を用意します。(符号とNULLのため)

入力を文字列で受け取ったら、まずは文字列が数字(と符号)だけでできているか確認します。
自分で処理を書くのが面倒だったら、isdigit関数を使えばいいと思います。(注:符号は判定してくれないらしい)

ここで文字列が数字だけでできていなかったらもう一度入力を促します。(do~whileとか使えばよさげ?)
文字列が数字だけでできていたら、atoi関数などでint型に変換します。
終わり

もう一つの方法は、getcharで一文字ずつ入力を受け付け、数字に変換していく方法です。

最初に数字を格納するデータ(suji)を0で初期化しておきます。
次に、getcharで入力された文字を数字か判定します。
数字だったらsujiを10倍して入力された数字を足し、それを新たなsujiとします。
あとはこれを入力が終わるまで繰り返します。
終わり

他にももっと頭のいい方法があるかもしれません^p^
c++初心者を自負しています。
質問者さんには今後私にプログラミングを教えてくれるようにやさしく丁寧に教えるつもりです。ぎぶあんどていく^p^
回答者さんには精一杯感謝します。ぎぶおんりー^p^

遊び人
記事: 42
登録日時: 3年前

Re: scanfを用いないint型の数字の入力を知りたい

#3

投稿記事 by 遊び人 » 3年前

前者の方法で無事成功しました。
勉強になりました、ありがとうございます(´∀`)
こうしてみると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型の数字の入力を知りたい

#4

投稿記事 by かずま » 3年前

遊び人 さんが書きました:前者の方法で無事成功しました。
勉強になりました、ありがとうございます(´∀`)
こうしてみると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;
}


遊び人
記事: 42
登録日時: 3年前

Re: scanfを用いないint型の数字の入力を知りたい

#5

投稿記事 by 遊び人 » 3年前

なるほど、今回は数字のみを入力することしか考慮していなかったので、そのパターンが頭から抜けておりました。
今後そちらのコードを採用させて頂きます。ありがとうございました。

返信

“C言語何でも質問掲示板” へ戻る