C言語関係掲示板

過去ログ

No.376.構造体への代入

[戻る] [ホームページ]
No.2505

構造体への代入。
投稿者---あきさ(2002/08/26 22:47:20)


下のように構造体にfor文で代入したのですがうまく代入できません。
どうすればうまくいくのでしょうか?構造体にいくつものものを代入するには、
for文では、だめなのでしょうか?
できればどなたかお教えください。

#include &lt stdio.h &gt

struct syain{
int ban;
int sei;
int tu;
int hini;
char na[30];
}b[20];
main()
{
int i;
int number[20];
int year[20];
int monthly[20];
int day[20];
char name[20];
/*上の配列には、要素数が入っているとします。*/

memset(b,0x00,sizeof(b));

/*構造体bへの代入*/
for(i=0; i<20; i++){
b[i].ban = number[i];
b[i].sei = year[i];
b[i].tu = monthly[i];
b[i].hini = day[i];
b[i].na = name[i];
}
}

No.2506

Re:構造体への代入。
投稿者---TDa(2002/08/26 23:37:40)


こんばんは。

とりあえず構造体のメンバのchar na[30]の扱いがおかしいですね。

他のメンバの扱いを考えればたぶん
char name[20][20];と宣言して
b[i].na = name[i]; ではなくて
strcpy(b[i].na, name[i]);
と書かなくちゃだめだと思いますよ。





No.2524

Re:構造体への代入。
投稿者---あきさ(2002/08/27 22:35:45)


>こんばんは。
>
>とりあえず構造体のメンバのchar na[30]の扱いがおかしいですね。
>
>他のメンバの扱いを考えればたぶん
>char name[20][20];と宣言して
>b[i].na = name[i]; ではなくて
>strcpy(b[i].na, name[i]);
>と書かなくちゃだめだと思いますよ。
>
>
>

ありがとうございます。今日やってみたらうまくいきました、charとintでは、
 
違うんですね。

No.2526

Re:構造体への代入。
投稿者---TDa(2002/08/27 23:05:37)


>ありがとうございます。今日やってみたらうまくいきました、charとintでは、
>違うんですね。

charとintが違うんじゃなくて配列が違うと言う方が正しいですね。
int foo[SIZE], bar[SIZE];
という配列foo, barがあったとしてfoo = bar;はコンパイルが通りません。
配列名だけでは左辺値になれないからです。

配列はその要素を一つづつコピーするしかありません。文字列のコピーはよく使うのでstrcpyと言う標準関数が用意されています。

ところで構造体は代入でコピーすることができます。
#include <stdio.h>
#include <string.h>

int main(void)
{
    struct Kouzoutai {
        int hoge;
        double piyo;
        char fuga[10];
    } foo, bar;

    foo.hoge = 10;
    foo.piyo = 1.4142;
    strcpy(foo.fuga, "abcdefg");
    bar = foo;
    
    printf("%d, %f, %s\n", bar.hoge, bar.piyo, bar.fuga);

    return 0;
}

foo = bar;と一発で代入できます。メンバに配列があっても
大丈夫です。しかしポインタでメモリ領域を確保しているようなメンバがあるとバグの温床になったりするのでよく理解してから使ってください。

No.2527

Re:構造体への代入。
投稿者---かずま(2002/08/27 23:22:27)


> 配列はその要素を一つづつコピーするしかありません。文字列のコピーは
> よく使うのでstrcpyと言う標準関数が用意されています。

配列のコピーは memcpy でできますよ。
    memcpy(foo, bar, sizeof foo);