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;
}
C言語列挙型でIntelliSense:識別子”s”が定義されていません
- tk-xleader
- 記事: 158
- 登録日時: 14年前
RE: C言語列挙型でIntelliSense:識別子”s”が定義されていません
scanf-sではなくて、scanf_s ですね。-(ハイフン)ではなくて _(アンダーバー)です。
オフトピック
どちらかと言えば日記というより質問掲示板に投げたほうがいいような内容ですね…
RE: C言語列挙型でIntelliSense:識別子”s”が定義されていません
C言語を勉強したいのなら、C言語の標準関数に対応していない、すなわち明らかにC言語に対応していないコンパイラではなく、moriuchi さんが書きました:C言語の列挙型を勉強しています。
きちんとC言語に対応したMinGWや学習用C言語開発環境などのコンパイラを利用することをおすすめします。
RE: C言語列挙型でIntelliSense:識別子”s”が定義されていません
うーん,VSをちゃんと調べてから発言しないと,相手を混乱させるだけかと。みけCAT さんが書きました:C言語を勉強したいのなら、C言語の標準関数に対応していない、すなわち明らかにC言語に対応していないコンパイラではなく、moriuchi さんが書きました:C言語の列挙型を勉強しています。
きちんとC言語に対応したMinGWや学習用C言語開発環境などのコンパイラを利用することをおすすめします。
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仕様かなにかを取り込んだのか,名前がかぶったのか……。
ただし,仕様が異なり,VC++のものは,「s等は必ず長さ指定子をつけること」であるのに対し,ISOの物は「s等の指定子に対応する引数の後に,rsize_t型の長さを引数として渡す」ことになっています。
MSがTR仕様かなにかを取り込んだのか,名前がかぶったのか……。