C言語列挙型でIntelliSense:識別子”s”が定義されていません

moriuchi
記事: 0
登録日時: 10年前

C言語列挙型でIntelliSense:識別子”s”が定義されていません

投稿記事 by moriuchi » 10年前

C言語の列挙型を勉強しています。VS2013を使用していますが下記のプログラムでscanf-sこの部分でビルトエラーが出ます。

IntelliSense:識別子”s”が定義されていません。どうしてこのようになるのでしょうか?

scanf("%c", &ch);だと必ずエラーになるためscanf-sに書き直しています

#include "stdafx.h"


enum { MSG_OK, MSG_YESNO };
enum { ID_OK = 1, ID_YES, ID_NO };

int Message(char *msg, int type) {
char ch;
switch (type) {
case MSG_OK:
printf("%s\tPush Enter>", msg);
scanf-s("%c", &ch);
return ID_OK;
case MSG_YESNO:
printf("%s y/n>", msg);
scanf-s("%c", &ch);
return (ch == 'y' ? ID_YES : ID_NO);
}
return 0;
}

int main() {
Message("Stand by Ready!", MSG_OK);
if (Message("Are you sure that's enough aromr?", MSG_YESNO) == ID_YES)
printf("This is not your appointed time to die.\n");
return 0;
}

アバター
tk-xleader
記事: 158
登録日時: 14年前

RE: C言語列挙型でIntelliSense:識別子”s”が定義されていません

投稿記事 by tk-xleader » 10年前

scanf-sではなくて、scanf_s ですね。-(ハイフン)ではなくて _(アンダーバー)です。
オフトピック
どちらかと言えば日記というより質問掲示板に投げたほうがいいような内容ですね…

アバター
みけCAT
記事: 6734
登録日時: 14年前

RE: C言語列挙型でIntelliSense:識別子”s”が定義されていません

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

moriuchi さんが書きました:C言語の列挙型を勉強しています。
C言語を勉強したいのなら、C言語の標準関数に対応していない、すなわち明らかにC言語に対応していないコンパイラではなく、
きちんとC言語に対応したMinGW学習用C言語開発環境などのコンパイラを利用することをおすすめします。

YuO
記事: 947
登録日時: 14年前

RE: C言語列挙型でIntelliSense:識別子”s”が定義されていません

投稿記事 by YuO » 10年前

みけCAT さんが書きました:
moriuchi さんが書きました:C言語の列挙型を勉強しています。
C言語を勉強したいのなら、C言語の標準関数に対応していない、すなわち明らかにC言語に対応していないコンパイラではなく、
きちんとC言語に対応したMinGW学習用C言語開発環境などのコンパイラを利用することをおすすめします。
うーん,VSをちゃんと調べてから発言しないと,相手を混乱させるだけかと。
scanfなどがエラーになるのは,プロジェクトのデフォルトとして/sdlが有効であるからというだけで,少なくともC90水準は達成しているはず (細かいところは見ていない) で,
C95だとsnprintfとwcstokあたりがあやしくなるはず。C99以降はライブラリ部分でC++から参照されるものが実装されている感じになりますが。
オフトピック
ちなみに,scanf_sはISO Cの関数でもあります (ISO/IEC 9899:2011 K.3.5.3.4)。
ただし,仕様が異なり,VC++のものは,「s等は必ず長さ指定子をつけること」であるのに対し,ISOの物は「s等の指定子に対応する引数の後に,rsize_t型の長さを引数として渡す」ことになっています。
MSがTR仕様かなにかを取り込んだのか,名前がかぶったのか……。