0

Cで文字列の2次元配列を読み取るのに問題がありました。名前、趣味の数(H)、趣味の名前のレイアウトのテキストファイルがあります。したがって、配列は趣味の数によって決定されます。

     #include <stdio.h>
     #include <string.h>

typedef struct{
char name[10];
int H;
char hobbi[20];
} data;

int main(void) {
data person[50];
FILE *input;
char source[]=("data.txt");
inout=fopen(source,"r");
int i=0;
int j;
while(!feof(input)) {

        fscanf(input, "%s", person[i].name);
        fscanf(input, "%d", person[i].H);
        for(j=0; j<=person[i].H; j++){
            fscanf(input, "%s", person[i].hobbi[j]);
            }
        i++;

}


fclose(input);
getchar();
getchar();
return 0;

}

そして私は次のように.txtファイルを持っています:

Jason 3 basketball bowling cycling
Arnold 2 boxing rollerskating
Mary 2 basketball rollerskating
Anne 3 bowling boxing basketball

このプログラムの目的は、趣味の名前を入力すると、その趣味に共通する名前のリストが表示されることです。しかし、最初に、私は入力部分を正しくしようとしています。コードの一部を英語に翻訳したので、コードを壊すような間違いがないことを願っています。どんな助けでも大歓迎です:)

4

1 に答える 1

1

あなたの例は、20文字を超える文字列である「バスケットボール ボウリング サイクリング」を示しています。各単語は別々に保存する必要があると想定しているため、Jason の場合、hobbi[0] = "バスケットボール"、hobbi[1] = "ボウリング" となります。ただしhobbi、20文字しか保持できません。20文字列を保持するために必要だと思います。現在、hobbi[0] = 'b'、hobbi[1] = 'a'、hobbi[2] = 's'、hobbi[3] = 'k'、hobbi[4] = 'e'、hobbi[ 5] = 't'。

hobbi をポインターの配列にする必要があります。そして、それぞれに新しいスペースを割り当てます。

char *hobbi[20];
...
fscanf(input, "%s", buffer);
person[i].hobbi[j] = strdup(buffer);

または、配列の配列にします。

char hobbi[20][20];

これらの両方で、person[i].hobbi[j]は文字列 (例: "basketball") でperson[i].hobbi[j][k]あり、文字 (例: 'b') です。

于 2013-02-23T18:31:59.503 に答える