【掲示板ご利用上の注意】

 ※題名は具体的に!
 ※学校の課題の丸投げ禁止!
 ※ソースの添付は「HTML変換ツール」で字下げ!
 ※返信の引用は最小限に!
 ※環境(OSとコンパイラ)や症状は具体的に詳しく!
 ※マルチポスト(多重投稿)は謹んで!

 詳しくはこちら



 本当はこんなに大きく書きたくはないのですが、なかなか守っていただけなくて…。
 守ってくださいね。お願いします。(by管理人)

C言語ソース⇒HTML形式ツール   掲示板2こちら


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

No.19319

2次元配列の付け足し
投稿者---MMZ(2005/01/19 01:47:35)


こんばんわ。
ちょっとした問題をやっていて躓いた部分があるのですが……。

#include <stdio.h>

#define MAXCHAR  10
#define MAXSTR   10

typedef struct{
    char str[11][MAXCHAR + 1]; 
    int year[11]; 
    int month[11]; 
} DATA;

int main(void)
{
    int i, n, c; 
    int a=0, j=0; 

    DATA user; 

    
    for (n = 0; n < MAXSTR; ) {
        
        printf("西暦を入力"); 
        scanf("%d", &user.year[j]); 

        printf("月を入力");
        scanf("%d", &user.month[j]);

        printf("文字列%dを入力:", n + 1); 

        /*nがMAXSTR=10になるまで処理を繰り返す*/

        for (i = 0; (c = getchar()) != '\n';)
        
            
            /*文字列入力*/
                                        
            if (i < MAXCHAR) {
                user.str[n][i++] = c;
                user.str[n][i] = '\0';
            }

            /*i<MAXCHAR=10の場合、代入とリセットの処理*/

            if (user.str[n][0] == '0') {
                printf("先頭に0入力のため終了\n"); 

            }

            /*先頭に0が入力された場合はループを抜ける*/

            if (user.str[n][0] == '\0') {
                printf("再入力:\n");
                }

            /*改行のみの場合は再入力処理*/


            else {
                printf("累積数:%d\n", ++n);
                }

            /*それ以外の場合は累積数を表示*/
        
    }

    for (i = 0; i < n; i++) {
        printf("%d件目:%s\n", i + 1, user.str[i]);
        /*入力された文字列の表示*/
        printf("年月日は:%d/%d\n", user.year[j], user.month[j]);
    }


    return 0; 
    
}


このプログラムは、2次元配列の文字列とその累積数を数える(10まで)プログラムに、構造体の配列に作り変えて年月日の項目を追加するものです。
追加する前まではきちんと動いていたのですが、構造体の配列を付け加えてからどうしても動作がおかしくなります。
具体的には年月日だけが入力され、文字列の入力が飛ばされるのですが……。
どうしたら上手くいくのか、ご教授願います。

バージョンはVisualC++ (R) ver6.0です。


この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:2次元配列の付け足し 19322 MMZ 2005/01/19 03:34:08


No.19322

Re:2次元配列の付け足し
投稿者---MMZ(2005/01/19 03:34:08)


改良を加えて動作はするようになりました。
しかしどうしても2つの「警告」が消えません。
ソースは以下です。

#include <stdio.h>
#include <stdlib.h>

#define MAXNAME 11  /* 名前の最大入力文字数 10文字 + '\0' */
#define BIRTH 5 /* 生年月日の「年」の形式「YYYY + '\0'」 */
#define DAY 3   /* 生年月日の「月」の形式「MM + '\0'」 */
#define MAXCASE 10 /* 最大ユーザー件数 */

void get_string(char *p_str, int xMaxChar); 

struct user
{
    char Name[MAXNAME];     /* ユーザ名 */
    char Birth[BIRTH];    /* 月 */
    char Day[DAY];      /* 日*/
};

void main(void)
{
    struct user s_user[MAXCASE]; 
    int Manth; 
    int i, j = 0; 

    /* データ入力 */
    /* 最大件数までループ */
    while( j < MAXCASE ){
        /* 名前入力 */
        printf("名前:"); 
        get_string(s_user[j].Name, MAXNAME);

        /* 1文字目が'0'のとき */
        if( s_user[j].Name[0] == '0' ){
            break; 
        }

        /* 改行のみのとき */
        if( s_user[j].Name[0] == '\0' ){
            printf("再入力\n");
            continue; 
        }
        
        /* 生年月日入力 */
        printf("年:"); 
        get_string(s_user[j].Birth, BIRTH); 

        /* 年の数字チェック */
        for(i = 0; i < 4; i++){
            /*  各桁の文字が0~9以外のときエラー */
            if( s_user[j].Birth[i] < '0' || '9' < s_user[j].Birth[i] ){
                printf("年の入力形式が正しくありません\n");
                exit(-1); 
            }
        }

        Manth = 0;
        printf("月:"); 
        get_string(s_user[j].Day, DAY); 

        /* 月の数字チェック */
        for(i = 0; i < 2; i++){
            /* 各桁の文字が0~9以外のときエラー */ 
            if( '0' <= s_user[j].Day[i] && s_user[j].Day[i] <= '9' ){
                Manth = Manth * 10 + s_user[j].Day[i] - '0'; 
            }
            else{
                printf("月の入力形式が正しくありません\n");
                exit(-1); 
            }
        }

        /* 月のチェック 1月~12月以外ならエラー */
        if( Manth < 1 || 12 < Manth ){
            printf("月の入力形式が正しくありません\n");
            exit(-1); 
        }

        printf("累計件数 = %d件\n\n", ++j); 
    }

    printf("\n入力データ表示\n"); 

    /* 3種の入力データ全てを表示 */
    for(i = 0; i < j; i++){
        printf("%d件目\n", i + 1); 
        printf("名前 = %s\n", s_user[i].Name); 
        printf("生年月日 = %s/%s\n\n", s_user[i].Birth , s_user[i].Day); 
    }
}

void get_string(char *p_str, int xMaxChar)
{
    int i = 0; 
    int C; 

    /* iCがEOFか改行が入力されるまでループ */
    while ( (C = getchar()) != EOF && C != '\n' ){
        /* 入力された文字がiMaxchar文字未満なら下の処理 */
        if( i < xMaxChar - 1 ){
            *p_str = C; 
            p_str++; 
            i++; 
        }
    }
    *p_str = '\0'; 
}


発生する「警告」は

C:\Program Files\Microsoft Visual Studio\MyProjects\prc18_2\prc18_2.c(5) : warning C4005: 'BIRTH' : マクロが再定義されました。
c:\program files\microsoft visual studio\myprojects\prc18_2\prc18_2.c(5) : 'BIRTH' の前の定義を確認してください
C:\Program Files\Microsoft Visual Studio\MyProjects\prc18_2\prc18_2.c(6) : warning C4005: 'DAY' : マクロが再定義されました。
c:\program files\microsoft visual studio\myprojects\prc18_2\prc18_2.c(0) : 'DAY' の前の定義を確認してください

このようなものなのですが……。
どうすれば警告が消えるでしょうか?
ご教授願います。


この投稿にコメントする

削除パスワード

No.19325

Re:2次元配列の付け足し
投稿者---MMZ(2005/01/19 04:42:52)


すいません、警告は消えました。
しかし、今度は月の数値が11○○〜や12○○〜といった、前二つの数値がありえる月(10,11,12ですね)の場合、終わらなくなってしまいました。
どう変更したらよろしいでしょうか?

ソースは以下のものです。

#include <stdio.h>
#include <stdlib.h>

#define MAXNAME 11  /* 名前の最大入力文字数 10文字 + '\0' */
#define YEAR 5  /* 生年月日の「年」の形式「YYYY + '\0'」 */
#define MOON 3  /* 生年月日の「月」の形式「MM + '\0'」 */
#define MAXCASE 10 /* 最大ユーザー件数 */

void get_string(char *p_str, int xMaxChar); 

struct user
{
    char Name[MAXNAME];     /* ユーザ名 */
    char Year[YEAR];        /* 年 */
    char Moon[MOON];        /* 月*/
};

void main(void)
{
    struct user s_user[MAXCASE]; 
    int Manth; 
    int i, j = 0; 

    /* データ入力 */
    /* 最大件数までループ */
    while( j < MAXCASE ){
        /* 名前入力 */
        printf("名前:"); 
        get_string(s_user[j].Name, MAXNAME);

        /* 1文字目が'0'のとき */
        if ( s_user[j].Name[0] == '0' ) {
            break; 
        }

        /* 改行のみのとき */
        if ( s_user[j].Name[0] == '\0' ) {
            printf("再入力\n");
            continue; 
        }
        
        /* 生年月日入力 */
        printf("年:"); 
        get_string(s_user[j].Year, YEAR); 

        /* 年の数字チェック */
        for (i = 0; i < 4; i++) {
            /*  各桁の文字が0~9以外のときエラー */
            if( s_user[j].Year[i] < '0' || '9' < s_user[j].Year[i] ){
                printf("年の入力形式が正しくありません\n");
                exit(-1); 
            }
        }

        Manth = 0;
        printf("月:"); 
        get_string(s_user[j].Moon, MOON); 

        /* 月の数字チェック */
        for (i = 0; i < 2; i++) {
            /* 各桁の文字が0~9以外のときエラー */ 
            if( '0' <= s_user[j].Moon[i] && s_user[j].Moon[i] <= '9' ){
                Manth = Manth * 10 + s_user[j].Moon[i] - '0'; 
            }
            else{
                printf("月の入力形式が正しくありません\n");
                exit(-1); 
            }
        }

        /* 月のチェック 1月~12月以外ならエラー */
        if ( Manth < 1 || 12 < Manth ) {
            printf("月の入力形式が正しくありません\n");
            exit(-1); 
        }

        printf("累計件数 = %d件\n\n", ++j); 
    }

    printf("\n入力データ表示\n"); 

    /* 3種の入力データ全てを表示 */
    for (i = 0; i < j; i++) {
        printf("%d件目\n", i + 1); 
        printf("名前 = %s\n", s_user[i].Name); 
        printf("生年月日 = %s/%s\n\n", s_user[i].Year , s_user[i].Moon); 
    }
}

void get_string(char *p_str, int xMaxChar)
{
    int i = 0; 
    int C; 

    /* iCがEOFか改行が入力されるまでループ */
    while ( (C = getchar()) != EOF && C != '\n' ){
        /* 入力された文字がiMaxchar文字未満なら下の処理 */
        if ( i < xMaxChar - 1 ) {
            *p_str = C; 
            p_str++; 
            i++; 
        }
    }
    *p_str = '\0'; 
}



この投稿にコメントする

削除パスワード

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