C4996とC4477のエラーがでてしまいscanfが使えません。
#define _CRT_SECURE_NO_WARNINGS 1
#pragma warning(disable : 4996)
など試してみたのですが、エラーが解決されません。
やっぱりgetsやsscanfを使ったりするしかないのでしょうか?
他の方はscanfとかどうやって使っているのでしょうか?
よろしくお願いします。
scanfが使えない。
Re: scanfが使えない。
getsはバッファオーバーランのリスクが高いと言われており、使わないべきです。ストロガノフ将軍 さんが書きました:やっぱりgetsやsscanfを使ったりするしかないのでしょうか?
getcharで1文字ずつ読み込み、自前でパースするという方法もあります。
Visual StudioやVisual C++は使わず、MinGWで普通にscanfを利用しています。ストロガノフ将軍 さんが書きました:他の方はscanfとかどうやって使っているのでしょうか?
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
Re: scanfが使えない。
_CRT_SECURE_NO_WARNINGSをdefineする場所は,stdio.hをインクルードするより前にありますか。ストロガノフ将軍 さんが書きました:C4996とC4477のエラーがでてしまいscanfが使えません。
#define _CRT_SECURE_NO_WARNINGS 1
#pragma warning(disable : 4996)
など試してみたのですが、エラーが解決されません。
stdio.hがインクルードされた時点での_CRT_SECURE_NO_WARNINGSの定義の有無に依存するので,stdio.hがインクルードされるより前に定義されていないと意味がありません。
stdafx.hでインクルードしているのであれば,stdafx.h中で定義するか,プロジェクトのプロパティのプリプロセッサの定義に追加してしまうとよいかと思います。
- 正しい位置にある_CRT_SECURE_NO_WARNINGの例
- 正しくない位置にある_CRT_SECURE_NO_WARNINGの例
プロジェクトの作成時にSDLを有効にするとしている場合,C4996はエラーになります。
このため,#pragma warningではエラーを抑制できません。
SDLの有効・無効自体はプロジェクトの生成時やプロジェクトのプロパティから変更できます。
勉強用であれば無効化してしまってもよいかと思いますが,実プロジェクトでの無効化は熟考が必要かと思います。
Re: scanfが使えない。
お二方ありがとうございます。
同じように修正してみたのですが、エラーが解決されません、
どこか間違っている点は、あるのでしょうか?
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main() {
int age;
int is_seito;
printf("年齢を入力してください---");
scanf("%d", age);
printf("猫でも学園の\n生徒さんですか?(Yes:1, No:0)---");
scanf("%d", is_seito);
if (age < 6 || is_seito == 1) {
printf("入場料は無料です\n");
}
else {
printf("入場料は1000円です\n");
}
return 0;
}
どこか間違っている点は、あるのでしょうか?
Re: scanfが使えない。
C4477の警告内容が全てを物語っています。ストロガノフ将軍 さんが書きました:同じように修正してみたのですが、エラーが解決されません、
どこか間違っている点は、あるのでしょうか?
訳) source.c(16): 警告 C4477: 'scanf' : 書式文字列'%d'は'int *'型の引数を必要としますが,(それに対応する)最初の可変個引数の型は'int'です。source.c(16): warning C4477: 'scanf' : format string '%d' requires an argument of type 'int *', but variadic argument 1 has type 'int'
※「それに対応する」は訳す時に追加しました
scanfの使い方を見直してみるとよいかと思います。
オフトピック
C4477のMSDNが見つからない……
本来的には,のような時に発生する警告/エラーです。