C++でscanfは使えない?

このQ&Aのポイント
  • C++でscanfは使えないのか?エラーが出る原因は何だろう?
  • お盆休みを利用してC言語の勉強をしようと思っていますが、C++でscanfが使えないことに困っています。
  • C++ではC言語の文法は使えると聞きましたが、scanfを使うとエラーが出てしまいます。原因は何でしょうか?
回答を見る
  • ベストアンサー

C++でscanfは使えない?

お盆休みを利用してC言語の勉強をしようと思っています。 さわり程度にはわかるのですが、ポインタなどを本気で理解してみようと思っています。 PCにvisual studio2013が入っているので、2013のC++のプロジェクトを使って勉強していこうと思っているのですが、下記のように入力すると、scanfでエラーが出てしまいます。 #include "stdafx.h" #include <stdio.h> void main() { int n; scanf("%d",&n); } C++ではC言語の文法は全て使えると聞いていたのですが、ある程度例外もあるということなのでしょうか?それともなにか原因があるのでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.3

scanfはC言語の「文法」ではありません。 「標準ライブラリ」と呼ばれる、ライブラリに含まれる関数の一つでしかありません。 あと、具体的にどんなエラーメッセージが出たのですか? メッセージの内容を読んで理解することも、プログラミング技術向上に大事なことです。 http://ja.wikipedia.org/wiki/Scanf#scanf.E3.81.AE.E5.95.8F.E9.A1.8C.E7.82.B9.E3.81.A8.E5.9B.9E.E9.81.BF.E6.96.B9.E6.B3.95 にあるように、scanfは使い方を間違えるととても「危険」な関数です。 そこで http://msdn.microsoft.com/ja-jp/library/9y6s16x1%28v=vs.100%29.aspx > セキュリティに関するメモ とあるように、Microsoftとしてはセキュリティ強化版を使うことを推奨しています。 # 根本対策にはなってないという説もありますが。 そのため、設定次第では、scanfを使っただけで警告、またはエラーになります。

satisfied999
質問者

お礼

scanfは文法ではないのですね。勉強になります

その他の回答 (5)

回答No.6

Visual STUDIO 2005くらいから scanf_sになっていると思います。 オーバーロードされた関数が沢山有りますのでscanf_sでググってみて下さい。 頑張ってね。

satisfied999
質問者

お礼

ありがとうございます。よくわからないながらにいろいろ触ってたらなんとかエラーがでなくなりました。

  • wormhole
  • ベストアンサー率28% (1621/5657)
回答No.5

本気で勉強するつもりならエラーメッセージを読むようにしましょう。 そこに原因が書いてあるんですから。 >C++ではC言語の文法は全て使えると聞いていたのですが、ある程度例外もあるということなのでしょうか?それともなにか原因があるのでしょうか? 今回の件はVC++の機能により一部関数の使用に制限がかけられてるだけです(文法は全く関係ない)。 ただしC++はCの完全な上位互換性があるわけではありません。

  • neuron-x
  • ベストアンサー率52% (139/266)
回答No.4

まだポインタなども理解されていないという事なので、細かい部分は抜きで簡単に説明します。 まず、文法には問題ありません。 エラーになっているのは、SDL(Security Development Lifecycle)と呼ばれる機能が原因です。 よく「プログラムの脆弱性により意図しないコードが実行される…」みたいなセキュリティに関する内容を見かけると思いますが、こういった脆弱性は、実は「scanfやstrcpyなど」が温床になっていたりします。 そういったことを知らない人たちが、手軽にscanfやstrcpyを使ったりすると、いとも簡単に脆弱性が埋め込まれてしまうのです。 さすがに、このままではまずい!…ということで、SDLと呼ばれる、「使うとセキュリティ的にまずい」ものをチェックする機能が追加されたのです。 Cの基礎を勉強するレベルであれば、まだそこまでは気にする必要は無いと思うので(いずれはセキュリティ的にどうしてだめなのかも理解してくださいね)、まずはSDLを無効にすれば良いと思います。 プロジェクトを作成する際に「SDLのチェックを外す」(添付画像参照)か、プロジェクトのプロパティで「構成プロパティ>C/C++>全般>SDLチェック」を「いいえ(/sdl-)」に設定すればこのチェックが行われなくなります。

  • Wr5
  • ベストアンサー率53% (2177/4070)
回答No.2

エラー 1 error C4996: 'scanf': This function or variable may be unsafe. Consider using scanf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details. d:\documents\documents\visual studio 2013\projects\qa8701599\qa8701599\source.cpp 6 1 qa8701599 とか言われますね。 VC2010くらいならエラーじゃなくてワーニング扱いだったかと思いますが。 対処は…メッセージに書かれているとおりでしょうかね。 難しい英文でもないので読んでくださいな。

satisfied999
質問者

お礼

失礼しました。調べてくださってありがとうございます。

  • hitomura
  • ベストアンサー率48% (325/664)
回答No.1

エラーの意味を聞きたいのなら「エラーが出てしまいます」というだけでなくそのエラーメッセージも書きましょう。 まあ、多分以下のページで話題になっていることだと思いますけど http://dixq.net/forum/viewtopic.php?f=3&t=13793

関連するQ&A

  • C言語でscanf()が先に実行されるのはなぜですか?

    C言語でscanf()が先に実行されるのはなぜですか? #include <stdio.h> int main(void){ int intNum; printf("整数を入力してください:\n"); scanf("%d", &intNum); printf("入力値は:%d\n",intNum); return(0); }

  • scanf関数について

    質問があります。 最近C言語を勉強し始めたのですが、scanf関数を使うと以下のような警告が出ます。 「arning C4996: 'scanf': This function or variable may be unsafe. Consider using scanf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details. c:\program files\microsoft visual studio 9.0\vc\include\stdio.h(306) : 'scanf' の宣言を確認してください。」 使用しているのは Visual C++ 2008 Express Editionです。

  • doループ内での scanf

    Visual C++ win32 console application でC言語の勉強をしています 制御文に入ったところで、scanf文が無視され、プログラムが進んでいく という事態に直面して困っています。 どなたか下記のプログラムの間違いを指摘してください あるいは  言語仕様についてご教示ください 以下、まるまるコピーします #include<stdio.h> int main(void) { int g; char ch; do{ printf("何ガロンですか?: "); scanf("%d", &g); printf("%.2fリットルです\n", (3.7854)*g); printf("また計算しますか?Y/N : "); scanf("%c", &ch); printf("%c\n", ch); }while(ch == 'Y'); return 0; } よろしくお願いします。長文失礼しました

  • c言語のポインタへの文字列入力についてです。

    当方c言語初学者なのですがscanfを使ってポインタに文字列を入力したいのですがバグが発生して進みません・・・どういうことなのでしょうか? #include <stdio.h> int main(void) { char *a; scanf("%s", a); printf("%s", a); return (0); } *aをa[128]; のように配列に変えるとうまくいくことはなんとかわかるのですが・・・助けてください(^_^;)

  • H8マイコンCでprintf/scanfが使いたい

    C言語ですがちょっと特殊な範囲です。 H8マイコンについてどうしてもわからないことがあったので質 問させていただきます。 H8-3687+HEW4を使っております。 やりたいことはRAMではなくROMに書き込んだ状態で printf/scanfを使用したいのです。 (Htermに文字列を表示するなど・・・。) 付属のstdio.hをインクルードしてもwrite/readが足りないとコンパ イラにおこられます。 とりあえず、モニタのlower.cを改造して使えばコンパイルは 通るのですが、動作はしません。(-1が返ってきます。) write単体では動くのですが・・・。 とにかく、ROMに書き込んでprintf/scanfをを使ってPCと通信したいの で、よい方法があればよろしくお願いします。 stdioに限らず、等価な結果が得られればかまいません。 もちろん、モニタ上でprintfは問題なく動きます。

  • scanfの謎

    C言語の以下のプログラムがありまして、 #include <stdio.h> main() { int i; scanf("%d ", &i);printf("d=%d\n", i); } これを実行すると、 1 2 d=1 のように、入力を2回受け付けてしまいます。 一体なんでこのようなことが起こるのでしょうか?教えてください。

  • scanf文がうまくいかないのですが・・・

    下のようなプログラムを実行するとうまくいかないのですが、何故なのでしょう。 どうかお教えください。 #include<stdio.h> int main(void) { int i; char n; for(i = 0; i < 10; i++) { printf("nを入力してください>>>"); scanf("%c",&n); printf("%c\n",n); } return 0; }

  • C言語のポインタについての質問です。

    C言語のポインタについての質問です。 2つのプログラムを作り、片方で数値を入力し、 もう片方でその数値を読み取りたいと思っています。 数値入力のプログラムは次のようになっています。 #include<stdio.h> void main(void){ int A=1; int *p; p=&A; printf("%p\n",p); } この実行結果は「0012FF88」となりました。 次にこの「0012FF88」というアドレスを使って「1」を読み取る 別のプログラムを作りたいと思っています。 #include<stdio.h> void main(void) { int add; int a; printf("アドレスは?\n"); scanf("%x",&add);    //「0012FF88」と入力 a=*(int*)add; printf("%x---->%d",&add,a); } このようなプログラムを作ってコンパイルできたのですが、 実行してアドレスを打ち込むと「Win32の例外が発生しました」 となって実行できません。 何かよい方法やプログラムの問題などありましたら 教えて頂けませんか?

  • C、C++

    SE未経験で勉強中です。 C、Visual studioC++、Windows 10 問題: sキーを入力してから10秒後に、 "10秒経ちました"と表示する。 for、Sleep、scanfを使用。 どのようにかいたらよいのか なんどやってもエラーは出ないものの 10秒経ったら文字が表示されることしかできず、 sキーを押してから10秒後、という処理ができません。 教えていただけたら幸いです。 #include 〈stdio.h〉 #include 〈windows.h〉 int main(void) { printf(“sキーを入力してください。”); Sleep(10000); printf(“10秒経ちました!” ); } ↑ここにどうやったらsキーを押してからこの処理を実行させるのですか?

  • Visual C++ 2008 Express Edition

    Visual C++ 2008 Express Editionをダウンロードしたのですが、使い方が全く分かりません。C言語を学習しています。 例えば #include <stdio.h> int main(void) { printf("Hello, World!\n"); return 0; } というようなプログラミングを実行するにはどうすればいいでしょうか

専門家に質問してみよう