No.4ベストアンサー
- 回答日時:
>一般的に入力される数字のサイズが不明の場合、どのようなコードを書けばよいのでしょうか?
int型変数に格納できない値が入力された場合にエラーとしたいのでしょうか? それでしたら、fgetsで入力データをバッファに格納してからチェックを行うことで可能となります。(もしくはチェックを行う関数を利用する。) longの場合でサンプルを作ってみました。
--------------------------------------------------
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <limits.h>
#define ERR_MSG(msg) {printf("%s\n", (#msg)); exit(1);}
int main() {
char buf[256];
long a;
/*入力*/
printf("%s", "数字を入力してください:");
fgets(buf, sizeof(buf), stdin);
buf[strlen(buf) - 1] = '\0'; /*改行削除*/
/*変換*/
if (strncmp(buf, "0", 2) != 0) { /*入力値 != 0*/
errno = 0;
a = strtol(buf, NULL, 10);
if (a == 0) {
ERR_MSG(変換失敗)
}
if ((errno == ERANGE) && (a == LONG_MAX)) {
ERR_MSG(レンジエラー : 入力値 > LONG_MAX)
}
else if ((errno == ERANGE) && (a == LONG_MIN)) {
ERR_MSG(レンジエラー : 入力値 < LONG_MIN)
}
}
else { /*入力値 == 0*/
a = 0;
}
/*出力*/
printf("入力値:%d\n", a);
return 0;
}
この回答への補足
回答いただいた内容が、私が期待していたものですが、
結局この方法でも255桁以上には対応できない。
また、256をどんなに大きくしても、それ以上の入力には対応できないので結局不可能なんだなと思っています。
但し、現実的には誰が255桁以上を入力するの?の世界なので問題ないのでしょうが・・・
No.7
- 回答日時:
#4です。
バッファサイズを256バイトとしたのは、long型変数で扱える桁数に対して十分なサイズだからです。つまり、256バイトのバッファに収まらない値はLONG_MAXを超えるので、残りの部分を切り捨ててしまおうということです。
#スペースを使われるとうまくいかないのはyoppiiさんのご指摘どおりです。あくまでサンプルなので...。
任意の桁数の入力を許可したい場合でしたら、ループの中でfgetsを使えば可能になります。ただし、入力値を利用する場合にそれ相応の工夫が必要になりますが...。
while(1) {
char *p;
p = fgets(buf, sizeof(buf), stdin);
if (p == NULL) break;
/*bufに対する処理*/
}
No.6
- 回答日時:
#4 の補足に対してです。
> 結局この方法でも255桁以上には対応できない。
255 桁以上入力されても余分に入力された分がストリームに残るだけですから、
別にエラーで落ちたりはしません。
問題なしです。
スペースを 250 桁入れた後、数字を 10 桁入れたりすると、
誤動作する可能性は無くは無いですが。
それが心配なら、
if (strlen(buf) > 32) {
puts("入力が長すぎる!");
return 0;
}
などとしておけばよいと思います。
No.5
- 回答日時:
#include <iostream>
using namespace std;
void main(void)
{
int a;
while(true)
{
cout<<"数字を入力してください";
cin>>a;
if(cin.good()==0)
{
cin.clear();
cin.seekg(0);
cout<<"int型で収納できません"<<endl;
break;
}
elsecout<<"入力された数字は"<<a<<endl;
}
}
なお
int a;
を
__int a;
に変えるとまだ__int a;を完全にはstreamが対応していないので動きません(無償borlandの場合)
そのときには旧式のscanfを使うしか有りません
参考URL:http://search.goo.ne.jp/click.jsp?DEST=http%3A%2 …
回答ありがとうございます。
何度も申しますが、貴殿の回答はC++だと思うのですが、私の希望はC言語です。
それとも、私が何か勘違いしてる???
No.3
- 回答日時:
失礼しました
質問をよく読まずに回答したので
数字の長さと思ってしまいました
数の大きさですね
だと
__int64 型の変数はどうでしょうか?
この回答への補足
最初の質問で書き忘れたのですが、
自分のプログラムに対して、ユーザーが大きすぎる値を入力しないように、
”1億以下の数字を入力ください”
といったコメントを出力してから、入力してもらえば問題ないと思いますが、そのようなコメントなしに自由に入力してもらい、プログラム上問題となる大きな数値を入力されたときに初めて、
”数値が大きすぎます”
といったコメントを出せるようなことは可能なのでしょうか?
<補足>
自分でこれを書いていて、コメントは出せるが、プログラム上は明らかに問題ありという気がして来ました。
No.2
- 回答日時:
string型を使えば長さ制限はありません
しかしOSの入力長制限が有るかもしれません
(250前後、実験で確かめること)
#include <string>
#include <iostream>
using namespace std;
void main(void)
{
string str;
int a;
cout<<"数字を入力してください";
cin>>str;
cout<<"入力された数字は文字列バージョンで"<<str<<endl;
a=atoi(str.c_str());
cout<<"入力された数字は整数型バージョンで"<<a<<endl;
}
a=atoi(?)
において?に数字を示す文字が無い場合にはaは0になります
No.1
- 回答日時:
string型を使えば長さ制限はありません
しかしOSの長さ制限が有るかもしれません
(250前後)
#include <string>
#include <iostream>
using namespace std;
void main(void)
{
stringstr;
inta;
cout<<"数字を入力してください";
cin>>str;
cout<<"入力された数字は文字列バージョンで"<<str<<endl;
cout<<"入力された数字は整数型バージョンで"<<atoi(str.c_str())<<endl;
}
atoi(?)
において?に数字を示す文字が無い場合には0になります
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- C言語・C++・C# c言語配列の結合についてです。 なぜうまくいかないのでしょうか。 #include <stdio.h 4 2022/05/30 22:42
- C言語・C++・C# 至急教えてください!プログラミングの問題です。 割られる整数と割る整数を受け取って、商と余りを出力す 3 2022/07/05 10:23
- C言語・C++・C# プログラミング c言語 4 2023/03/07 01:05
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- C言語・C++・C# C言語 3 2022/10/04 15:07
- C言語・C++・C# C言語階乗の総和を求める 2 2023/03/04 23:31
- C言語・C++・C# C言語の課題が出たのですが自力でやっても分かりませんでした。 要素数がnであるint型の配列v2の並 3 2022/11/19 17:41
- C言語・C++・C# c言語でユーザ関数を利用して入力された文字列を反転させるプログラムを作りたいです。 3 2023/01/29 19:47
このQ&Aを見た人はこんなQ&Aも見ています
-
新NISA制度は今までと何が変わる?非課税枠の拡大や投資対象の変更などを解説!
少額から投資を行う人のための非課税制度であるNISAが、2024年に改正される。おすすめの銘柄や投資額の目安について教えてもらった。
-
数字以外が入力されたらエラー文を出したい。
C言語・C++・C#
-
fgetsなどのときのstdinのバッファを消すには?
C言語・C++・C#
-
Enterキーを押されたら次の処理に移るという事をしたい。
C言語・C++・C#
-
-
4
C言語 配列の長さの上限
C言語・C++・C#
-
5
csvファイルをfscanfで読み込むと変な文字が出てきます
C言語・C++・C#
-
6
printfとputcharの違いは
C言語・C++・C#
-
7
バッファとは何ですか
C言語・C++・C#
-
8
C言語 数字以外を入力させない方法 教えてください
C言語・C++・C#
-
9
どんなプログラムを書いても指定されたファイルが見つかりません。と出てきます。どうやったら解決しますか
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
正負を反転させて出力するプロ...
-
java初心者です。入力されたの...
-
*をユーザーが入力した数字の数...
-
数字以外が入力されたらエラー...
-
プログラミングの問題です 「金...
-
cout関数を使っているのですが...
-
プログラミング初心者です。 Py...
-
"scanf"でエンターで改行させな...
-
Userformの入力順序をタブオー...
-
scanfが2回使えない・・・?;
-
ワードで文字を入力する時の変...
-
if文の条件にscanf関数を使うと…?
-
入力値が1以下、かつ数字以外の...
-
java 入力された文字列を数値に...
-
プログラム(C)
-
scanf関数について
-
WindowsでEOF
-
2進数の1の数を数える問題
-
Linuxで入力待ちなしkeyread関...
-
プログラムC言語の整数の約数に...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
double型が正常に認識されてい...
-
プログラミング初心者です。 Py...
-
正負を反転させて出力するプロ...
-
Excel VBAで、Application.Inpu...
-
C言語について。
-
batプログラム上で文字列を入力...
-
*をユーザーが入力した数字の数...
-
cout関数を使っているのですが...
-
漢字のソートについて
-
数字以外が入力されたらエラー...
-
Userformの入力順序をタブオー...
-
ワードで文字を入力する時の変...
-
Linuxで入力待ちなしkeyread関...
-
java初心者です。入力されたの...
-
EDITコントロールで入力できる...
-
Eclipseコンソール表示を、リセ...
-
小数か整数かを判定する方法
-
C言語scanf_sで何故か2回入力に...
-
VB.NETで16進数+16進数や16進...
-
Linuxプログラミングで、キーボ...
おすすめ情報