ページ 1 / 1
文字列、数値の構造体について質問です。
Posted: 2013年6月20日(木) 16:27
by きょう
2人の名前、得点を打ち込み、今回は一番目の人の結果のみを表示しようと思っています。自分はこのようにコードを書き込みました。
コード:
#include<stdio.h>
struct student
{
char name[64];
int tokuten;
}
int main(void)
{
struct student data[2]/*二人分なのでdata[2]*/
data[0].name[64]="aoba";
data[0].tokuten=16;
data[1].name[64]="konisi";
data[1].tokuten=26;
printf("%sさんの得点は%dです。",data[0].name[64],data[0].tokuten);
return 0;
}
しかし、エラーがでてうまくいきません。
エラーの内容は以下の通りです。
「int」型の変数の値を「struct student」型の変数に自動的に変換することはできません。
全く異なる型で計算を行うことは通常ありえないことです。
計算に使用している変数名を間違えていないかどうか確認してください。
ここで、
struct student data[2]/*二人分なのでdata[2]*/
data[0].name[64]="aoba";
を
コード:
struct student data[2]={"aoba",16,"konisi",26};
か、
data[0].name[64]="aoba";、data[1].name[64]="konisi";を
#include<string.h>を入れて、
コード:
strcpy(data[0].name[64],"aoba");
strcpy(data[1].name[64],"konisi");
としたのですが、うまくいきませんでした。
どこを変えれば、うまく動作するのでしょうか?
よろしくお願いします。
Re: 文字列、数値の構造体について質問です。
Posted: 2013年6月20日(木) 16:33
by non
全部で4カ所ほどエラーがありますが、一番大きな問題。
まず、文字列は、お察しの通り、strcpyを使いますが、第一引数は配列の先頭アドレスをいれます。
Re: 文字列、数値の構造体について質問です。
Posted: 2013年6月20日(木) 16:36
by non
初期値を入れる
struct student data[2]={"aoba",16,"konisi",26};
この方法は合ってます。他のエラーで、だめだっただけです。
Re: 文字列、数値の構造体について質問です。
Posted: 2013年6月20日(木) 16:46
by beatle
nonさんが指摘しているように,data[0].name[64]に文字列を代入しようとしているのが大きな問題.
※しかも,nameは要素数64の配列なので,何を代入するにせよname[64]は範囲外アクセスです.
それから,ところどころセミコロンがないのも大きな問題です.
6行目の } の後,9行目の ] の後にはセミコロンをつけないといけません.
インデント(字下げ)は正しく行いましょう.
参考までにお聞きしたいのですが,使っている開発環境は何でしょうか?
Re: 文字列、数値の構造体について質問です。
Posted: 2013年6月20日(木) 16:55
by きょう
ご回答ありがとうございます。
本当に初歩な質問ですみません。
>data[0].name[64]に文字列を代入しようとしているのが大きな問題.
※しかも,nameは要素数64の配列なので,何を代入するにせよname[64]は範囲外アクセスです.
どうして文字列は代入できないのでしょうか?
たとえば、
http://wisdom.sakura.ne.jp/programming/c/c34.html
のサイトでは、sinobu.name = "前原しのぶ";と代入しています。配列にするとできないということでしょうか?
また、範囲外アクセスとはどういうことでしょうか?調べてみたのですが、わかりませんでした。
Re: 文字列、数値の構造体について質問です。
Posted: 2013年6月20日(木) 16:59
by きょう
ご回答ありがとうございます。
strcpyでは第一引数は配列の先頭アドレスを入れるということですが、strcpyのwiki(
http://ja.wikipedia.org/wiki/Strcpy)を見ても確かに配列の場合、先頭のアドレスを入れているのはわかりました。
ということは、
strcpy(&data[0].name[64],"aoba");
strcpy(&data[1].name[64],"konisi");
ということでいいのでしょうか?
よろしくお願いします。
Re: 文字列、数値の構造体について質問です。
Posted: 2013年6月20日(木) 17:05
by きょう
また、今使っている環境は、
苦しんで覚えるC言語のサイトにある、学習用C言語開発環境です。
Re: 文字列、数値の構造体について質問です。
Posted: 2013年6月20日(木) 17:10
by non
上のサイトでは、構造体のメンバーはポインタです。ポインタはアドレスを入れる変数です。
sinobu.name = "前原しのぶ";
は、データエリアに"前原しのぶ"という文字列が格納されており、その先頭アドレスを、sinobu.nameというポインタ変数に入れてます。
char name[64];
これは、ポインタではありあませんので、アドレスを入れることができません。
また、このように宣言したとき、配列は64個(64バイト)用意されますが、その要素番号は[0]から[63]までで、[64]は存在しません。
ですから、配列外です。
Re: 文字列、数値の構造体について質問です。
Posted: 2013年6月20日(木) 17:11
by non
きょう さんが書きました:
strcpy(&data[0].name[64],"aoba");
strcpy(&data[1].name[64],"konisi");
ということでいいのでしょうか?
違います。[64]は存在しません。
Re: 文字列、数値の構造体について質問です。
Posted: 2013年6月20日(木) 17:46
by box
構造体はとりあえず後回しにして、
char型の配列に関する知識(データの格納や出力の方法)を
じゅうぶんに蓄えるようにする方がよいと思います。
Re: 文字列、数値の構造体について質問です。
Posted: 2013年6月20日(木) 18:00
by きょう
もうすこしよく考えてみます。
ありがとうございました。