scanfが使えない。

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
ストロガノフ将軍

scanfが使えない。

#1

投稿記事 by ストロガノフ将軍 » 4年前

C4996とC4477のエラーがでてしまいscanfが使えません。
#define _CRT_SECURE_NO_WARNINGS 1
#pragma warning(disable : 4996)
など試してみたのですが、エラーが解決されません。
やっぱりgetsやsscanfを使ったりするしかないのでしょうか?
他の方はscanfとかどうやって使っているのでしょうか?
よろしくお願いします。

アバター
みけCAT
記事: 6247
登録日時: 9年前
住所: 千葉県
連絡を取る:

Re: scanfが使えない。

#2

投稿記事 by みけCAT » 4年前

ストロガノフ将軍 さんが書きました:やっぱりgetsやsscanfを使ったりするしかないのでしょうか?
getsはバッファオーバーランのリスクが高いと言われており、使わないべきです。
getcharで1文字ずつ読み込み、自前でパースするという方法もあります。
ストロガノフ将軍 さんが書きました:他の方はscanfとかどうやって使っているのでしょうか?
Visual StudioやVisual C++は使わず、MinGWで普通にscanfを利用しています。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

YuO
記事: 941
登録日時: 9年前
住所: 東京都世田谷区

Re: scanfが使えない。

#3

投稿記事 by YuO » 4年前

ストロガノフ将軍 さんが書きました:C4996とC4477のエラーがでてしまいscanfが使えません。
#define _CRT_SECURE_NO_WARNINGS 1
#pragma warning(disable : 4996)
など試してみたのですが、エラーが解決されません。
_CRT_SECURE_NO_WARNINGSをdefineする場所は,stdio.hをインクルードするより前にありますか。
stdio.hがインクルードされた時点での_CRT_SECURE_NO_WARNINGSの定義の有無に依存するので,stdio.hがインクルードされるより前に定義されていないと意味がありません。
stdafx.hでインクルードしているのであれば,stdafx.h中で定義するか,プロジェクトのプロパティのプリプロセッサの定義に追加してしまうとよいかと思います。
  • 正しい位置にある_CRT_SECURE_NO_WARNINGの例

    コード:

    #define _CRT_SECURE_NO_WARNINGS
    
    #include <stdio.h>
    
    int main(void)
    {
    	char buf[256];
    	scanf("%255s", buf);
    	puts(buf);
    
    	return 0;
    }
  • 正しくない位置にある_CRT_SECURE_NO_WARNINGの例

    コード:

    #include <stdio.h>
    
    #define _CRT_SECURE_NO_WARNINGS
    
    int main(void)
    {
    	char buf[256];
    	scanf("%255s", buf);
    	puts(buf);
    
    	return 0;
    }
次に,#pragma warningはその名の通りwarning, 警告(の表示)を抑制または有効化する機能であって,エラーに対しては意味がありません。
プロジェクトの作成時にSDLを有効にするとしている場合,C4996はエラーになります。
このため,#pragma warningではエラーを抑制できません。
SDLの有効・無効自体はプロジェクトの生成時やプロジェクトのプロパティから変更できます。
勉強用であれば無効化してしまってもよいかと思いますが,実プロジェクトでの無効化は熟考が必要かと思います。

ストロガノフ将軍

Re: scanfが使えない。

#4

投稿記事 by ストロガノフ将軍 » 4年前

お二方ありがとうございます。

コード:

#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;
}
同じように修正してみたのですが、エラーが解決されません、
どこか間違っている点は、あるのでしょうか?

YuO
記事: 941
登録日時: 9年前
住所: 東京都世田谷区

Re: scanfが使えない。

#5

投稿記事 by YuO » 4年前

ストロガノフ将軍 さんが書きました:同じように修正してみたのですが、エラーが解決されません、
どこか間違っている点は、あるのでしょうか?
C4477の警告内容が全てを物語っています。
source.c(16): warning C4477: 'scanf' : format string '%d' requires an argument of type 'int *', but variadic argument 1 has type 'int'
訳) source.c(16): 警告 C4477: 'scanf' : 書式文字列'%d'は'int *'型の引数を必要としますが,(それに対応する)最初の可変個引数の型は'int'です。
※「それに対応する」は訳す時に追加しました
scanfの使い方を見直してみるとよいかと思います。
オフトピック
C4477のMSDNが見つからない……
C4700はC4477で指摘された間違いのために起きている警告で,SDLによりエラーになっています。
本来的には,

コード:

{
    int a, b;
    /* aへの代入無し */
    b = a;
    /* ... */
}
のような時に発生する警告/エラーです。

ストロガノフ将軍

Re: scanfが使えない。

#6

投稿記事 by ストロガノフ将軍 » 4年前

回答ありがとうございます。
解決しました。

閉鎖

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