• ベストアンサー

Visual C++ Express Edition 警告に関して

Visual C++ Express Editionを導入して最近Cを学び始めたのですが、 Visual C++ Express Editionでコンパイルした際に警告がたくさん でてしまいます。エラーさえなければ実行はできるようですが、できれば警告もなくしないです。以下がソースファイルです。 #include <stdio.h> int main(void) { int x,y,z; z=1; for(;z == 1;){ printf("数値を入力してください:\n"); scanf("%d",&x); printf("数値を入力してください:\n"); scanf("%d",&y); printf("加算すると%d\n減算すると%d\n" "乗算すると%d\n除算すると商%dは余りは%d\n",x+y,x-y,x*y,x/y,x%y); printf("計算を続けますか?\n続けなるならば1を押してください:"); scanf("%d",&z); } return(0); } コンパイルをすると警告として以下がでました。 c:\program files\microsoft visual studio 8\vc\include\stdio.h(295) : 'scanf' の宣言を確認してください。 今回の例の場合の警告の解決方法と一般的に警告をどのように解決をすればいいのか(エラーだったら文法的に間違えているのだが、警告だと?)教えてください。

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

  • ベストアンサー
  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.3

VC++ExpressEditionと同時にインストールされるヘルプ MSDNはご覧になりましたか? これで scanfなどを表示すると 冒頭に 標準入力ストリームから書式付きデータを読み取ります。セキュリティが強化されたバージョンが使用可能になったので、これらの関数は使用されなくなりました。「scanf_s、_scanf_s_l、wscanf_s、_wscanf_s_l」を参照してください といった文言が確認できるかと思います つまり MicrosoftのVC++コンパイラのCRT(Cランタイムライブラリ)が更新されて scanfなどは古い形式になりました と言う警告です 表示された警告メッセージの『C4996』をクリックして F1キーを押してヘルプを参照してみましょう

oumu0923
質問者

お礼

ヘルプでscanfで検索したところたしかに↑のような内容が記載されていました。scanfをscanf_sにしたところ警告もなくなり安心しました。 回答ありがとうございました。

その他の回答 (2)

  • crew21
  • ベストアンサー率26% (58/222)
回答No.2

文法的な問題はないよ。 試しにBorland C++ でワーニングレベルを最高に挙げてコンパイルしてみたがワーニングは出なかったし。 それよりも、主題からは外れるけど、もうちょっとプログラムの動作性を保証するよう組むべきだな。 >続けなるならば1を押してください >数値を入力してください の何れの場所でも、数値以外のキー(例えばY)を押下すると無限ループしちゃうよね。 きついこと言ってすまんが、学び始めとはいえ、これは通らんぞ。

oumu0923
質問者

お礼

たしかに数値以外を押すと無限ループしました。 例外な操作?が行われた際への対処方法はおいおい理解していこう と思います。 ご指摘ありがとうございました。

  • php504
  • ベストアンサー率42% (926/2160)
回答No.1

VC++2005から文字列を扱う標準関数に警告が出るようになっただけでプログラムには問題ありません。 http://www.geocities.jp/ky_webid/common/vc2005warning.html

oumu0923
質問者

お礼

解説されているHPを提示していただきありがとうございました。

関連するQ&A

  • Visual C++ 2008 Express Edition

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

  • C言語。どうしてコンパイルできません^^;

    最近プログラミングの勉強をはじめました。 C言語を勉強しています。 /*入力した値の、平均値・最大値・最小値・を出す。*/ #include <stdio.h> int main(void) { int x[5],i,j,w,x,y,z,sum; printf("5つの実数の平均、最大値、最小値を求めます\n"); sum = 0; for(i=0; i<5; i++){ printf("値%d:",i+1); scanf("%d",&x[i]); sum += x[i]; } for(y=0; y<5; y++){ for(j=0; j<4; j++){ w=j+1; if(x[j] < x[w]){ z = x[i]; x[i] = x[w]; x[w] = z; } } } printf("平均値:%f\n最大値:%d\n最小値:%d\n", (double)sum/5, x[0], x[4]); return 0; } Microsoft Visual C++ 2008 Express Edition でコンパイルをしようとしたのですが、 「error C2040: 'x' : 'int' は 'int [5]' と間接操作のレベルが異なります。」 と出てできませんでした^^; 何度も見直したのですが、どうしても間違っている場所がわかりません^^; どこがいけないのでしょうか^^;

  • C言語、ポインタについて。

    C言語初心者です。"やさしいC"などの入門書を呼んでいて「ポインタ」につまづきました。 別書を買ったり、サイトを見たりしたのですが、理解できませんでした。 "やさしいC"からの引用なのですが、 正: #include <stdio.h> int add(int *x1,int *x2,int a); int main (void){ int n1,n2,a,ans; printf("2科目分の点数を入力してください。\n"); scanf("%d",&n1); scanf("%d",&n2); printf("加算する点数を入力して下さい。\n"); scanf("%d",&a); ans = add(&n1,&n2,a); printf("%d点加算しましたので\n",a); printf("科目1は%d点となりました。\n",n1); printf("科目2は%d点となりました。\n",n2); } int add(int *x1, int *x2,int a){ *x1+=a; *x2+=a; } 誤: #include <stdio.h> int add(int x1,int x2,int a); int main (void){ int n1,n2,a,ans; printf("2科目分の点数を入力してください。\n"); scanf("%d",&n1); scanf("%d",&n2); printf("加算する点数を入力して下さい。\n"); scanf("%d",&a); ans = add(n1,n2,a); printf("%d点加算しましたので\n",a); printf("科目1は%d点となりました。\n",n1); printf("科目2は%d点となりました。\n",n2); } int add(int x1, int x2,int a){ x1+=a; x2+=a; } この2つの違いはなんでしょうか。 アドレスか、そうでないか、という違いはわかりますが、なぜ"誤"のコードだと正しく処理されないのかがわかりません。 教えてください、お願いします。 (「やさしいC」の回答より引用)

  • C言語の簡単なプログラム

    簡単な足し算のみの電卓をC言語で作っています。 /が入力されるまで足し算を繰り返すものです。 コンパイルをして、足し算を繰り返すところまでは上手くいったのですが、 /を入力してのループの抜け方がわかりません。 #include<stdio.h> int main(void) { int x=0,z; printf("数値を入力\n"); printf("終了は/を入力\n"); printf("\n結果 %d\n",x); while(1){ scanf("%d",&z); x=x+z; /* 足し算の計算 */ printf("結果 %d\n",x); /* 現在の計算結果を表示 */ } printf("終了 結果: %d\n",x); /* 計算の終了、合計値の表示 */ return 0; } while文のなかにifでいれればいいのでしょうか? その場合、 if(z=='/') break; でいいんでしょうか? if文以外のやり方がある場合も教えていただけたらと思います。 よろしくお願いします。

  • C言語 プログラミングで行詰まりました…

    標準入力(キーボード)からi,jk,nの値を入力し、次の漸化式を計算し、X_0からX_nまで求めるプログラムを作成したいのですが、うまく表示されません。どかがおかしいのかご指摘お願いします。 <漸化式> X_n=(a+b)/X_(n-1) , X_0=c(n=0) ================================================================== #include<stdio.h> float f_X(int a,int b,float c) { float y; y=(a+b)/c; return y; } int main (void) { int number,i,j; float k,l,n,X; printf("i:"); scanf("%d", &i); printf("j:"); scanf("%d", &j); printf("k:"); scanf("%f", &k); printf("n:"); scanf("%f", &n); X=k; printf("X_0= %.6f\n",X); for(number=1;number<=n;number++) { l=f_X(i,j,X); printf("X_%d= %.6f \n",number,l); X=l; } return 0; } ===================================================================

  • 学校の課題で2次方程式のプログラムを作ってみたのですが、足りない部分ががあるらしいのでお教えてください

    キーボードからある整数の値を入力して、2次方程式を解くというプログラムを作ったのですが、解の方程式のところでどこかが足りないらしいのですが教えてください。 #include<math.h> #include<stdio.h> int quadraticEquation(double a, double b, double c){ int x,y,l,k,j; double z; x=b*b; y=4*a*c; z=x-y; if(z>=0){ l=sqrt((double)z); } else printf("ERROR!!\n"); k=(-b)+l; j=k/2*a; return j; } int main(void){ int n1,n2,n3; printf("input three integer!\n"); printf("intger1:"); scanf("%d",&n1); printf("intger2:"); scanf("%d",&n2); printf("intger3:"); scanf("%d",&n3); printf("kotaeha %d %d desu\n",quadraticEquation(n1, n2, n3),quadraticEquation(n1, n2, n3)); return 0; } が自分が作ったプログラムです。 後、解が2つある場合の出力方法がこれであっているかどうかも教えてください。 よろしくお願いします。

  • ファイル分割について

    今本をみながら練習中なのですが、ファイル分割がうまくいきません。以下のような3つのプログラムをかいたのですが実行できません。 (一つ目:myfunc.h) int max(int x,int y); (二つ目:myfunc.c) int max(int x,int y){ if(x > y) return x; else return y;} (三つ目:sample.c) #include <stdio.h> #include "myfunc.h" int main(void){ int x,y,c; printf("1番目の整数\n"); scanf("%d",&x); printf("2番目の整数\n"); scanf("%d",&y); c = max(x,y); printf("最大値は%d\n",c); return 0;} すべてコンパイルしてsample.cを実行してもだめでした。ご指導お願いします><

  • 警告 W8065について。

    このプログラムを実行したら、実行結果は思い通りになったのですが、 「警告 W8065…プロトタイプのない関数」 と言うのが出ました。  (1)これを消すにはどうすればよいのかを教えてください。  (2)このプログラムはわざと4つに分けているのでこの状態のままプログラムのどこをいじればよいのかを教えてください。 OSはWindows XPでボーランドのコンパイラを使用しています。 #include<stdio.h> int hiki(); int kake(); int waru(); int main(){ int a,b; printf("一つ目の数字\n"); scanf("%d",&a); printf("二つ目の数字\n"); scanf("%d",&b); printf("計%d\n",a+b); hiki(); return 0; } int hiki (){ int c,d; printf("一つ目の数字\n"); scanf("%d",&c); printf("二つ目の数字\n"); scanf("%d",&d); printf("計%d\n",c-d); kake(); return 0; } int kake (){ int e,f; printf("一つ目の数字\n"); scanf("%d",&e); printf("二つ目の数字\n"); scanf("%d",&f); printf("計%d\n",e*f); waru(); return 0; } int waru (){ int g,h; printf("一つ目の数字\n"); scanf("%d",&g); printf("二つ目の数字\n"); scanf("%d",&h); printf("計%d\n",g/h); return 0; }

  • プログラムの練習問題をやっていたのですが、練習問題の答えのような実行結

    プログラムの練習問題をやっていたのですが、練習問題の答えのような実行結果にならないので教えていただけませんか? 下記に記したプログラムを実行すると x=9 y=-9 [ 9]*[-9]=[ -81],[ 9]*[-8]=[ -72],[ 9]*[-7]=[ -63],・・・・ ・・・・ [10]*[-9]=[ -90],[10]*[-8]=[-80],・・・・ ・・・・ のようになるのですが、 x=9 y=-9 [ 9]*[-9]=[ -81],[10]*[-9]=[-90],・・・ [ 9]*[-8]=[ -72],[10]*[-8]=[-80],・・・ [ 9]*[-7]=[ -63],・・・ ・・・・ のようにするためにはどうすればいいですか? #include <stdio.h> int main(void) { int x,y,m,n; printf("x="); scanf("%d",&x); printf("y="); scanf("%d",&y); for(m=x;m<=x+3;m++) { printf("\n"); for(n=y;n<=y+14;n++) { printf("[%2d]*[%2d]=[%4d],",m,n,m*n); } printf("\n"); } return(0); }

  • visual studio 2013のエラー

    #include <stdio.h> int main(void) { int n1, n2; int wa; puts("二つの整数を入力してください。"); printf("整数1:"); scanf_s("%d", &n1); printf("整数2:"); scanf_s("%d , &n2") wa = n1 + n2; printf("それらの和は%dです。\n", wa); return 0; } エラー 1 error C2146: 構文エラー : ';' が、識別子 'wa' の前に必要です。 c:\users\伸之\documents\visual studio 2013\projects\training\source.cpp 10 1 training 2 IntelliSense: ';' が必要です c:\Users\伸之\Documents\Visual Studio 2013\Projects\training\Source.cpp 9 2 training のエラーが出たなんですけど、原因がわかりません。 よろしくお願いします。

専門家に質問してみよう