2011-02-09 8 views
0

私は非常に基本的な質問があります。scanfを使用した動的データ構造

私は、ちょうど整数値と次の構造体へのポインタを持つ動的なデータ構造を持っています。私はscanfを使用して、ユーザー入力を取得して5つの値を取得して構造体に追加し、最後に出力を印刷しようとしています。構造体への入力を得るための構文に問題があります。私は(それがあまりにも基本であるためか!)無駄で、StackOverflowのとGoogleを中心に見てきた

をここにコードです:

#include <stdio.h> 

struct List 
{ 
    int value; 
    struct List *nextaddr; 
}; 

int main() 
{ 
    int int1, int2, int3, int4, int5; 

    printf("please enter the first integer: "); 
    scanf("%d", int1); 
    struct List t1 = {int1}; 

    printf("please enter the second integer: "); 
    scanf("%d", int2); 
    struct List t2 = {int2}; 

    printf("please enter the third integer: "); 
    scanf("%d", int3); 
    struct List t3 = {int3}; 

    printf("please enter the fourth integer: "); 
    scanf("%d", int4); 
    struct List t4 = {int4}; 

    printf("please enter the fifth integer: "); 
    scanf("%d", int5); 
    struct List t5 = {int5}; 

    struct List *first; 

    first = &t1; 
    t1.nextaddr = &t2; 
    t2.nextaddr = &t3; 
    t3.nextaddr = &t4; 
    t4.nextaddr = &t5; 
    t5.nextaddr = NULL; 

    printf("%i\n%i\n%i\n%i\n%i\n",first->value,t1.nextaddr->value,t2.nextaddr->value,t3.nextaddr->value,t4.nextaddr->value); 

    return 0; 
} 

私は構造体にユーザー入力を取得できますか?

答えて

0

scanfのように整数のアドレスを取得する必要があります:scanf("%d", &int1);

+0

愚かな間違い。ありがとう! – rick

+0

私はあなたには別の問題があると思いますが、 'scanf'を呼び出すのですが、' c'をたくさん使っていないので、ちょっと試してみてください:)。 –

1

数THINGS-

通常

、あなたは、(あなたがこのケースであるように)リンクされたリストのようなリンク構造での作業スタック上ではなくmallocを使用してヒープ上のオブジェクトのメモリを割り当てます。この背後にある論理的根拠は、リンクされた構造の要素がそれらを作成する関数よりも長く存続し、個々のセルをスタック割り当てすることが正しく機能しない可能性があるということです。ユーザーからリンクされているリストセルの内容を読み取り、それをリストに追加するためのロジックは、各セルで同一であるので、あなたはおそらく、フォローアップとして

struct List* entry = malloc(sizeof(struct List)); 

のようなものを書くことで構造を作成したいです読んでいるのであれば、おそらくコードを5回コピーするだけではありません。

struct List* ReadListEntry(void) { 
    struct List* entry = malloc(sizeof(struct List)); 
    /* ... initialize 'entry' ... */ 

    return entry; 
} 

その方法は、mainでコードが5回を短くすることができ、そして(あなたが行っているように見えるよう)あなたがコード内のバグを見つけた場合、あなただけの必要があります。その代わり、このような関数を書くことを検討5回ではなく、1回それを変更する。

あなたの元の質問については、私はこの問題は、あなたが

scanf("%d", myValue); 

代わりの

scanf("%d", &myValue); 

この最初のバージョンを書いていることは正しくないと、実行時にクラッシュを引き起こす可能性があることだと思い。 scanfは、%dフォーマット指定子を使用するたびに、ポインタを整数ではなく整数に指定していることを前提としているため、明示的なアンパサンドはおそらくあなたを傷つけています。

ヒープに割り当てられたリストの細胞を生成するためにヘルパー関数を使用するには、上記のアイデアでこれを組み合わせることで、あなたはこのように関数を記述しようとする場合がありますが:

struct List* ReadListEntry(void) { 
    struct List* entry = malloc(sizeof(struct List)); 

    scanf("%d", &entry->value); 
    entry->nextaddr = NULL; 

    return entry; 
} 

がこれを考えると、おそらくあなたのmainを書き換えることができますあなたが現在持っているものよりはるかに簡単です。私はそれを読者に練習として残しておきます。 :-)

これは役に立ちます。

+0

これは素晴らしい情報です - 私はあなたが関数を書く必要がある以上のことを書く必要があることを学んでいます。 mallocは、これらのことを行う方法と思われます。特に、値を無期限に入力するループを作成する場合は特にそうです。私はあなたを投票することができれば幸いです!ありがとう! – rick

関連する問題