掲示板利用宣言

 次のフォームをすべてチェックしてからご利用ください。

 私は

 題名と投稿者名は具体的に書きます。
 課題の丸投げはしません。
 ソースの添付は「HTML変換ツール」で字下げします。
 返信の引用は最小限にします。
 環境(OSとコンパイラ)や症状は具体的に詳しく書きます。
 返信の付いた投稿は削除しません。
 マルチポスト(多重投稿)はしません。

掲示板2

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧

No.25736

構造体の配列を関数に渡して表示すると文字化けしてしまいます
投稿者---yk(2006/01/26 11:04:51)


タイトル通りなんですけど、練習のため下記コードを作成、コンパイルして実行すると文字化けしてしまいます。原因と対策を教えてください。
よろしくお願いします。

#include<stdio.h>
struct mail{
char name[50];
char address[50];
char city[50];

};
int output(struct mail *sbm);

int main(void){

int counter;

struct mail blackmail[10];
struct mail* sbmp;
sbmp=blackmail;

for(counter=0;counter<3;++counter){
printf("宛先名を入力してください");
scanf("%s",sbmp->name);
printf("その人の住所を入力してください");
scanf("%s",sbmp->city);
printf("メールアドレスを入力してください");
scanf("%s",sbmp->address);

++sbmp;

}

output(sbmp);
return 0;
}

int output(struct mail* sbm){

printf("\n%s",sbm->address);
return 0;
}


この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:構造体の配列を関数に渡して表示すると文字化けしてしまいます 25737 kz3 2006/01/26 11:08:33
<子記事> Re:構造体の配列を関数に渡して表示すると文字化けしてしまいます 25738 nop 2006/01/26 11:51:19
<子記事> Re:構造体の配列を関数に渡して表示すると文字化けしてしまいます 25742 yk 2006/01/26 13:03:57


No.25737

Re:構造体の配列を関数に渡して表示すると文字化けしてしまいます
投稿者---kz3(2006/01/26 11:08:33)


>タイトル通りなんですけど、練習のため下記コードを作成、コンパイルして実行すると文字化けしてしまいます。原因と対策を教えてください。
>よろしくお願いします。

その前に「掲示板利用宣言」を無視する原因と対策を考えた方がいいと思います。
投稿する前に掲示板の雰囲気を掴んでおいたほうがいいと思うのですが・・・。


この投稿にコメントする

削除パスワード

No.25738

Re:構造体の配列を関数に渡して表示すると文字化けしてしまいます
投稿者---nop(2006/01/26 11:51:19)


まず、【掲示板利用宣言】をよく読み理解して下さい。
そして、書かれている事を守って投稿して下さい。


> struct mail blackmail[10];

まず、初期化がされておりません。


>for(counter=0;counter<3;++counter){
>  ++sbmp;
>}
>output(sbmp);

この時、「sbmp」がどこを指しているのか判りますか?

「&(blackmail[3])」を指していますよね?
入力は、blackmail[0]〜blackmail[2]の3個の入力を行っていますが、
blackmail[3]には、何の入力もありません。
また、初期化されていないため、何が入っているか判りません。

つまり、何が表示されるか判らないのです。
文字が化けているのではなく、
何が入っているか判らないものを表示しているだけなのです。


この投稿にコメントする

削除パスワード

No.25742

Re:構造体の配列を関数に渡して表示すると文字化けしてしまいます
投稿者---yk(2006/01/26 13:03:57)


OS:WindowsXP
コンパイラ:MicrosoftVisualC++
次から気をつけます。返信ありがとうございました


この投稿にコメントする

削除パスワード

No.25747

Re:構造体の配列を関数に渡して表示すると文字化けしてしまいます
投稿者---nop(2006/01/26 16:24:50)


>次から気をつけます。返信ありがとうございました

それで、何がどう問題で、どうなったのですか?
解決したのですか?していないのですか?
解決したのでしたら、どの様に解決したのですか?
解決していないのでしたら、どこまで判っていて、
何が判らないのですか?


この投稿にコメントする

削除パスワード

No.25765

Re:構造体の配列を関数に渡して表示すると文字化けしてしまいます
投稿者---yk(2006/01/27 10:48:58)



#include<stdio.h>
    struct mail{
        char name[50];    /*宛名*/
        char address[50];   /*メールアドレス*/
        char city[50];    /*住所*/

    };
int output(struct mail *sbm);/*プロトタイプ宣言*/

int main(void){

    int counter;

    struct mail blackmail[10];
    struct mail* sbmp;
    sbmp=blackmail;

    /*入力した値を構造体に格納*/
    for(counter=0;counter<3;++counter){
        printf("宛先名を入力してください");
        scanf("%s",sbmp->name);
        printf("その人の住所を入力してください");
        scanf("%s",sbmp->city);
        printf("メールアドレスを入力してください");
        scanf("%s",sbmp->address);
            
        ++sbmp;

    }
    /*アドレスをsbmp[0]に戻し、output関数に渡す*/
    sbmp-=3;
    output(sbmp);
    return 0;
}

int output(struct mail* sbm){
    
    int select,counter=0;
    FILE* fp;

    printf("入力した全てを出力する場合は0を、一文だけ出力する場合には1を、出力せず終了する場合は2を入力してください");
    scanf("%d",&select);

    switch(select){

    case 0:
        /*入力した全てを出力*/      
        fp=fopen("C:\\Documents and Settings\\tanioka\\デスクトップ\\メールアドレス.txt","w");
        for(counter=0;counter<3;++counter){
            fprintf(fp,"宛名:%s\n住所:%s\nメールアドレス:%s\n\n",sbm->name,sbm->city,sbm->address);
            ++sbm;
        }

        fclose(fp);
        break;

    case 1:
        /*選択した部分を出力*/
        printf("入力した何人目を出力しますか?(1〜3)");
        scanf("%d",&counter);
        fp=fopen("C:\\Documents and Settings\\tanioka\\デスクトップ\\メールアドレス.txt","w");
        fprintf(fp,"宛名:%s\n住所:%s\nメールアドレス:%s\n\n",sbm[counter-1].name,sbm[counter-1].city,sbm[counter-1].address);
        fclose(fp);
        break;

    case 2:
        /*何もしない*/
        break;
    default:
        break;
    }

return 0;
}


結果はこういう感じになりました。
sbmp-=3;
とし、アドレスを3つ戻してやる事で無事解決しました。
ありがとうございます。


この投稿にコメントする

削除パスワード

No.25766

Re:構造体の配列を関数に渡して表示すると文字化けしてしまいます
投稿者---kz3(2006/01/27 11:11:00)



>sbmpとし、アドレスを3つ戻してやる事で無事解決しました。
>うございます。

入力件数が3件でなかったらそのプログラムは再度修正してコンパイルしなければなりません。
何よりあまり定数を直接埋め込むべきではないと思うので、

sbmp = blackmail;

としてポインタを再び配列の先頭を指すようにすればOKです。
こっちの方を推奨します。


# というかykさん、自分でプログラム先頭でそうやって初期化しているじゃないですか。

struct mail blackmail[10]; struct mail* sbmp; sbmp=blackmail;








この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧