プロが教えるわが家の防犯対策術!

最近C言語を勉強を始めまして、参考書に載っていた以下のソースプログラムをvisualC++2010に打ち込んだのですがビルドが成功しません
#include <stdio.h>
#include <math.h>

int main(void)
{
int d[33];
double m,v,s;
int n=33;
int i;
double sum;

printf("データを%d個入力してください\n",n);
for(i=0;i<n;i++)
{
printf("date %d=",i+1);
scanf_s("%d",&d[i]);
}

for(sum=0.0,i=0;i<n;i++)
{
sum+=d[i];
}

m=sum/n;

for(sum=0.0,i=0;i<n;i++)
{
sum+=(d[i]-m)*(d[i]-m);
}
v=sum/n;
s=sqrt(v);

printf("平均=%10.3f\n",m);
printf("分数=%10.3f\n",v);
printf("標準偏差=%10.3f\n",s);

return 0;
}

エラーメッセージは
・'scanf' の宣言を確認してください。
・(11): warning C4566: ユニバーサル文字名 '\u00A5' によって表示されている文字は、現在のコード ページ (932) で表示できません
・(14): warning C4566: ユニバーサル文字名 '\u00A5' によって表示されている文字は、現在のコード ページ (932) で表示できません
・(14): error C2065: 'i1' : 定義されていない識別子です。

と出るのですがさっぱりわかりません。どなたか教えてください。

A 回答 (3件)

回答2の補足に書かれている警告は、scanfが(バッファオーバーランを起こす可能性があるので)安全でないかもしれないというものです。

代わりに、対策されているscanf_sを使うか、この警告を出さない設定(_CRT_SECURE_NO_WARNINGSを定義する)が提案されています。
scanfを使うと、必ず出るものです。
    • good
    • 1
この回答へのお礼

ありがとうございました。

お礼日時:2011/06/24 00:10

そのエラーになったプログラムをそのまま貼り付けてないのでは?サンプルの方を貼り付けたとか、サンプル見ながら入力しなおした、とか


エラーがあると報告されている行数と、おそらくのそれが出ているであろう行が一致してません。
正しい情報が無ければ、こちらでは判断できません。

エラーメッセージの読み方はわかりますか?
()の中がエラーのある行数、errorはビルドに致命的な「エラー」、warning はビルドはできるけども、場合によっては実行時に問題になる「警告」、その後のC???はエラー番号で、これで検索するとある程度の解説が見付かる。その後は簡単にエラー/警告の内容を説明しているものです。

> ・(14): error C2065: 'i1' : 定義されていない識別子です。

メッセージの通り、定義されていない識別子(変数とか定数とか関数とか) i1 が使われている、というものですが、このプログラム中にどこにも i1 なんて書いてありません。
おそらく
printf("date %d=",i+1);

printf("date %d=",i1);
となっているのでは?
/* あと、細かいことを言えば「data」ですね */

> ・'scanf' の宣言を確認してください。
scanfはどこで使っているのでしょう?エラーメッセージはもうすこし長くなかったですか?

> ・(11): warning C4566: ユニバーサル文字名 '\u00A5' によって表示されている文字は、現在のコード ページ (932) で表示できません

ちょっと根が深い問題です。
nの前の\は実際にはどう表示されていますか?
/を反対にしたような記号(バックスラッシュ)でしょうか?円記号でしょうか?
なんにせよ、一度消して、キーボードの円記号のキーを入力しなおしてください。

この回答への補足

新しくプロジェクトを作って以下のように入力してみたら警告がでましたが、実行できました
#include <stdio.h>
#include <math.h>

int main(void)
{
int d[33];
double m,v,s;
int n=33;
int i;
double sum;

printf("データを%d個入力してください\n",n);
for(i=0;i<n;i++)
{
printf("data%d=",i+1);
scanf("%d",&d[i]);
}

for(sum=0.0,i=0;i<n;i++)
{
sum+=d[i];
}

m=sum/n;

for(sum=0.0,i=0;i<n;i++)
{
sum+=(d[i]-m)*(d[i]-m);
}
v=sum/n;
s=sqrt(v);

printf("平均=%10.3f\n",m);
printf("分散=%10.3f\n",v);
printf("標準偏差=%10.3f\n",s);

return 0;
}
コピペしたので、そのままです。nの前\は円マークです。
エラーメッセージは
.cpp(16): warning 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.
1> c:\program files\microsoft visual studio 10.0\vc\include\stdio.h(304) : 'scanf' の宣言を確認してください。
とでました。

補足日時:2011/06/23 05:59
    • good
    • 0

貼り付けられているソースをVS2008のVC++でコンパイルすると、コンパイルは通りましたね。


なので、ここにあるソースは、問題ないようですね。

原因は

>>printf("データを%d個入力してください\n",n);

の"\"がうまくユニコードに変換されないため、

>>・(11): warning C4566: ユニバーサル文字名 '\u00A5' によって表示されている文字は、現在のコード ページ (932) で表示できません

のエラーになったように思えます。

とりあえず、漢字メッセージを漢字以外のアルファベット表示に変えてみるとコンパイルエラーは無くなると思います。

なかなかユニコード変換が絡むと、よくわからないエラー状況になりますね。
    • good
    • 1

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!