No.1ベストアンサー
- 回答日時:
>scanf( )ライブラリが仕様上の問題により
仕様上の問題が何を指しているかわかりませんが。。。?
>業務上のプログラムで使われない理由って何ですか?
仕様がきちんと理解されない。
危ないと教えられたからそれを妄信している人が多い。
#事実危ないですが、キチンと使えばそれなりに安全です。
というレベルかと。
>またその代わりに何を使えばいいんですか?
「代わりに」とありますが、処理によっては代わりにならないかも。
文字列を標準入力から文字列を受け取るレベルなら、
殆どの処理系でfgetsが使われます。
No.8
- 回答日時:
> またその代わりに何を使えばいいんですか?
scanfの代わりに何を使うかは目的によって異なりますし、それがscanfより優れているかというと、必ずしもそうではありません。
よく言われるfgets + sscanfにしても、#5で説明したように、整数、浮動小数点数、ワイド文字(列)に対してはエラーチェックができません。また、
char str[31+1];
scanf("%31[^\n]%*[^\n]%*c", str);
のようにして1行入力するコードをfgetsで置き換えるには、改行文字を除去したり、配列に格納し切れなかった読み残しの文字を捨てたりと、結構面倒な処理を行う必要があります。
No.7
- 回答日時:
>業務上のプログラムで使われない理由って何ですか?
プログラム内にscanf("%d",&a);などの数値入力用のscanfしかなく、ループしている時に、「0,1」などと入力すると「,」を処理することができなくなり、「stdin」がプログラム終了まで使えなくなります。
1文字の打ち間違いで、残りの入力が使えなくなるような関数を業務用のプログラムで使えるわけがありません。
>またその代わりに何を使えばいいんですか?
他の方の言うように、fgets,sscanfを使ってください。
No.6
- 回答日時:
>バッファオーバーランではなく、
>数値がオーバーフローやアンダーフロー
ご指摘ありがとうございます...orz
>scanf("%s")では、バッファオーバーランが起き得ます。
%sでは読み込むバイト数を指定すれば、
バッファオーバランを回避することができます。
>fgets+sscanf
sscanfの仕様もscanfの仕様も入力ストリームが違うだけで
スキャン集合の仕様には差異がありません。
今回の質問に関して言えば、開発者の中でもNo4さんのように
考えている方が非常に多いというのが理由だと思います。
#わたしもC言語の規格書を読むまではそう思っていましたし。。。
No.5
- 回答日時:
scanf系の関数は、入力内容の誤りを検出することがほとんどできません。
よく言われるバッファオーバーランは実は回避可能で、本当の問題は数値のエラー判定ができないことにあります。
基本的には、#2さんのご指摘どおりなのですが、バッファオーバーランではなく、数値がオーバーフローやアンダーフローを起こして、格納先の型で表現できない場合の動作が未定義になります。
他には、%lsや%lcを用いた場合、不正な多バイト文字であったり、その時点でのロケールで適切なワイド文字への変換が行えない場合に破綻してしまう問題もあります。
こうした問題は、fgets + sscanfに置き換えても何の解決にもなりません。
参考URL:http://www.kijineko.co.jp/tech/superstitions/buf …
No.4
- 回答日時:
scanf("%d")ではバッファオーバーランは起きないと思いますけどね。
(ソースコードに当たって確認したわけではありませんが、常識的なアルゴリズムであれば)scanf("%s")では、バッファオーバーランが起き得ます。
注意して使えば済むだけなのですが、「scanfは一切使うな」といって済ませてる傾向が強いです。
scanfをfgets+sscanfに置き換えるとか、そもそもscanf系の関数を使わないとか、いろいろ。
No.2
- 回答日時:
>事実危ないですが
一応何が危ないかというと、
int num;
scanf("%d",&num );
こういうコードに対して、int型の表現範囲を超える数値が
(例えば9999999999999999999999999999999999999999999999999999など)
入力されるとバッファオーバランするからです。
>文字列を標準入力から文字列を受け取るレベルなら、
>殆どの処理系でfgetsが使われます。
日本語おかしいですね;
「文字列を標準入力から受け取るレベルなら、
殆どの処理系でfgetsが使えます。」
が正しいです。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C言語プログラム変更 2 2022/12/21 15:03
- C言語・C++・C# C言語 3 2022/10/04 15:07
- C言語・C++・C# 至急教えてください!プログラミングの問題です。 割られる整数と割る整数を受け取って、商と余りを出力す 3 2022/07/05 10:23
- C言語・C++・C# C言語でif文が予想と違う動きをする件について7 4 2023/03/20 00:26
- C言語・C++・C# C言語階乗の総和を求める 2 2023/03/04 23:31
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
- C言語・C++・C# 10個の実数に対する降順ソート結果を出力するプログラムを作りたいのですが、以下のプログラムをどう直せ 1 2022/07/09 22:16
- デスクトップパソコン HPの法人用パソコンに個人用のゲーミングモニターは対応しますか? 3 2022/08/10 20:02
- C言語・C++・C# C言語(構造体) 3 2022/07/05 20:08
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
*をユーザーが入力した数字の数...
-
プログラミング初心者です。 Py...
-
C言語scanf_sで何故か2回入力に...
-
小数か整数かを判定する方法
-
正負を反転させて出力するプロ...
-
2進数の1の数を数える問題
-
java初心者です。入力されたの...
-
VB.NETで16進数+16進数や16進...
-
enterでループ終了
-
cout関数を使っているのですが...
-
Java 6人分の得点を入力し、平...
-
if文の条件にscanf関数を使うと…?
-
double型が正常に認識されてい...
-
数字以外が入力されたらエラー...
-
入力されたとき,何も入力しな...
-
C言語でつるかめ算をするにはど...
-
Eclipseコンソール表示を、リセ...
-
C言語 逆ピラミッドの作り方
-
scanf が無視されます
-
コマンドプロンプトからのEOFの...
マンスリーランキングこのカテゴリの人気マンスリー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プログラミングで、キーボ...
おすすめ情報