2012-03-01 9 views
0

Cの構造体に問題があります。ポインタに問題があると思います。ここに私のプログラムがしなければならないことがあります。 このような入力データを読み込みます。 「:」、例えばこんにちは、 構造にその値を入れCの構造体の値を印刷するのに苦労します

Name: Hello 
Gender: Male 
Age: 60 

Name: Hello1 
Gender: Male 
Age: 13 

Name: Hello2 
Gender: Female 
Age: 10 

Name: Hello3 
Gender: Male 
Age: 20 

は、私は、プログラムの後に言葉を読みたいです。したがって、構造体のインデックス[1]には、たとえばhello、male、60などが含まれている必要があります。

whileループ内に値を出​​力すると、正常に印刷されています。しかし、whileループの外側にある構造体の値を試して印刷すると、うまくいきません。私はこれを出力として得る。

¿6Q ¿6Q 60 
↑ 13 
æ £ 10 
§☺ ☺ 20 

各要素の年齢は印刷されていますが、他の要素は表示されません。私はしばらくこのことに苦労しており、なぜこれが当てはまるのか分かりません。ご協力ありがとうございました;

+2

この宿題はありますか?もしそうなら、そのようにフラグを立ててください。また、なぜ '' char [80]; ''と '' fgets(line、100、fr) 'をするのか教えてください。 –

+0

これには私がやっている宿題に当てはまる要素があります。これは一般的に構造を把握するために行いました。どのように私は宿題としてそれをフラグするのですか?それは間違いだった、指摘してくれてありがとう。 – user1005253

答えて

1

まず第一に、宿題として宿題をマークにしてください: はここに私のコードです。

第2に、氏が指摘したように、変数lineを80文字の長さに割り当てていますが、ファイルから100文字まで読み込んでいます。長い行では問題が発生します。 79文字を超えないようにしてください(最後に\0の場合は1を残してください)。 「印刷」について今

は、私はあなたの問題は、これらの行にあると思う:lineとして

p[nameIndex].name = (char*)malloc(sizeof(line)); 
p[nameIndex].gender = (char*)malloc(sizeof(line)); 
p[nameIndex].age = (char*)malloc(sizeof(line)); 

は、本質的にchar *あり、sizeof(line)は、あなたが期待している結果が得られません。代わりに、strlen機能を使用する必要があります。ここではなく、データをコピーする場所で使用してください。あなたのコードは次のようになります:

switch(i) 
{ 
    case 1: 
     p[nameIndex].name = (char*)malloc(strlen(tmp) + 1); 
     strcpy(p[nameIndex].name, temp); 
     break; 
    case 2: 
     p[nameIndex].gender = (char*)malloc(strlen(tmp) + 1); 
     strcpy(p[nameIndex].gender, temp); 
     break; 
    case 3: 
     p[nameIndex].age = (char*)malloc(strlen(tmp) + 1); 
     strcpy(p[nameIndex].age, temp); 
     break; 
    default: 
     break; 
} 

もちろん、これは各文字が1バイトの記憶域を取ると仮定しています。それ以外の場合は、(strlen(tmp) + 1) * sizeof(char)を使用して適切な割り当てを行う必要があります。

+0

ありがとうございます。どのように私はそれを宿題としてマークしますか? – user1005253

+0

@AleksG 'line'はポインタではなく配列なので、' sizeof(line) 'は80です!あなたは自分でテストすることができます。 –

+0

@ user1005253あなたの質問にタグを選択したら、タグ「宿題」を追加して、 –

関連する問題