2016-04-04 19 views
0

私はC初心者クラスの割り当てを持っています:1つの変数(値という名前)とリストへのポインタを持つ構造体を作成することになっています。私は5つの値を入力としてプロンプトを表示し、それらをリンクされたリストに格納することになっています。次に、リストを印刷します。私はどのようにリストに入力を格納するのか分かりません。私は5つの値を初期化するプログラムを書くことができました。しかし、私は入力を受け入れてリストに格納する方法を知らない。リンクリストへのユーザ入力の格納 - C

は、ここで私は値を初期化作業プログラムです:

#include <stdio.h> 

struct list 
{ 
    double value; 
    struct list *nextVal; 
}; 

int main() 
{ 
    struct list v1 = {10}; 
    struct list v2 = {17.97}; 
    struct list v3 = {166}; 
    struct list v4 = {2}; 
    struct list v5 = {387.55}; 
    struct list *first; 

    first = &v1; 
    v1.nextVal = &v2; 
    v2.nextVal = &v3; 
    v3.nextVal = &v4; 
    v4.nextVal = &v5; 
    v5.nextVal = NULL; 

    printf("All the values are: %.2f, %.2f, %.2f, %.2f, %.2f.", 
    first->value,v1.nextVal->value,v2.nextVal->value, 
    v3.nextVal->value,v4.nextVal->value); 

    return 0; 
} 

ここで私は、ユーザー入力を取得し、リストにそれを保存しようとしたプログラムです。 (私は5の代わりに2つの値しか持っていません。それを動作させようとすると、それを扱う方が簡単です。)このプログラムをコンパイルすると、エラーは発生しません。私がそれを実行するとき、私は2つの入力値のために適切に促される。しかし、プログラムが出力した出力が両方の値に対して0を書き込んだ場合。私の前提は、実際にどのように行われたのかわからないので、値をリストに間違って格納しているということです。 (私の教科書やオンラインの情報は見つけられません)昨夜、誰かが別の質問にコメントしました。私はブレークポイントを使って、どこに問題があるのか​​を正確に突き止めなければなりませんでした。それをどうやって行うのか分からない。 (私はそれが非常にシンプルなものだと仮定していますが、どこでも私はオンラインで見て、人々は彼らが何を話しているかを知っているように見えるように説明します - 私はそうではありません - そして正直なところ、それを理解することができます、私はまだその情報をどうしたらいいのか分からないでしょう、私はちょうどリンクされたリストにユーザーの入力を格納する方法に関する情報を見つけることができません。)とにかく、両方の最終値に対して0を返します。

#include <stdio.h> 

struct list 
{ 
    double value; 
    struct list *nextVal; 
}; 

int main() 
{ 
    double val1,val2; 

    printf("Please enter a number: "); 
    scanf("%f",&val1); 
    printf("Please enter a number: "); 
    scanf("%f",&val2); 

    struct list v1 = {val1}; 
    struct list v2 = {val2}; 
    struct list *first; 

    first = &v1; 
    v1.nextVal = &v2; 
    v2.nextVal = NULL; 
    printf("The two values entered are %.2f and %.2f.", 
    first->value,v1.nextVal->value); 

    return 0; 
} 

ありがとうございます!そして、私は初心者です。とても簡単なものを提案しても、私はそれが何であるかを知りません。ありがとうございました!

+0

関数mallocについて知っていますか? –

答えて

1
scanf("%f",&val1); 

%ffloat変数が必要ですが、与えられた変数はdoubleです。 doubleには%lfを使用してください。

scanf("%lf",&val1); 
あなたのコンパイラは、あなたにそのための警告を与えているはずですし、常にそれらに耳を傾け、それらを解決する必要があり

:彼らは直接あなたの質問に対処していないのにアドバイスの

warning: format ‘%f’ expects argument of type ‘float *’, but argument 2 has type ‘double *’ [-Wformat=] 
scanf("%f",&val1); 

いくつかの余分な単語を:

  • 常に関数の戻り値を確認してください。具体的には、期待入力が解析されたことを確認するには、scanfをチェックします。ユーザーが予期せぬことを入力すると、そのコードは失敗します。
  • コードを機能に分割します。具体的には、リンクリストにアイテムを追加するには、別のinsert関数を作成します。
  • コードを繰り返す必要がある場所でループを使用します。 scanfのようなものです。そうすれば、入力を増やしたいときに簡単に拡張できます。
+0

ありがとうございました。私はそれを修正し、それは動作します。私のコンパイラは私に何の警告も出さなかった。それが問題の内容について私がとても混乱していた理由だった。 –

+0

どのコンパイラを使用していますか?ほとんどのコンパイラには、警告レベルを上げるオプションがあります。それを行う方法を見つけてビルドに使用できるようにすることをお勧めします。 – kaylum

0

最小限私はこれを使用して警告などでコンパイルしてみてください...

バージョン

include <stdio.h> 

struct list 
{ 
    double value; 
    struct list *nextVal; 
}; 

int main() 
{ 
    double val1,val2; 

    printf("Please enter a number: "); 
    scanf("%lf",&val1); 
    printf("Please enter a number: "); 
    scanf("%lf",&val2); 

    struct list v1 = {val1}; 
    struct list v2 = {val2}; 
    struct list *first; 

    first = &v1; 
    v1.nextVal = &v2; 
    v2.nextVal = NULL; 
    printf("The two values entered are %.2f and %.2f.", 
     first->value,v1.nextVal->value); 

    return 0; 
} 

あなたが引用符をスキャンして、二重に割り当てしようとしていた作業

gcc -Wall -pedantic -std=c11 

。良いコンパイラはあなたに警告を与えるでしょう。

scanf.c:14:14: warning: format specifies type 'float *' but the argument has type 'double *' [-Wformat] 
    scanf("%f",&val1); 
     ~~ ^~~~~ 
     %lf 
scanf.c:16:14: warning: format specifies type 'float *' but the argument has type 'double *' [-Wformat] 
    scanf("%f",&val2); 
     ~~ ^~~~~ 
     %lf 
関連する問題