0

ここにスニペットがあります:

void addproductInterface(Tsklep **head){
    char* name = (char*)malloc(sizeof(char)*100);
    double price;
    do{
        printf("Name: ");
        scanf("%s[^\n]", name);
        fflush(stdin);
        printf("\nPrice: ");
        scanf("%lf", &price);
        fflush(stdin);
        addProduct(&(*head), name, price);
    } while(prompt("Do you want to add another one?"));

動作しますが、別の製品を追加すると、以前の製品 (および以前の製品) がこの名前に変更されます。毎回同じポインターを渡し、それが指す配列を (別の製品を追加するときに) 変更するだけのようです。私はそれを正しく理解していますか?それを修正する方法はありますか?

4

5 に答える 5

3

はい、あなたが説明したように聞こえます。のコードを見ずに確実に判断するのは難しいですaddProduct()が、それは新しいメモリを割り当てる場所です。

一時的な自動 (スタック上) のバッファを入力に使用し、次にレコードを格納するときに永続的な割り当てを行う必要がありますaddProduct()

do{
    char name[64];
    double price;

    printf("Name: ");
    scanf("%63s", name);
    fflush(stdin);
    printf("\nPrice: ");
    scanf("%lf", &price);
    fflush(stdin);
    addProduct(&(*head), name, price);
} while(prompt("Do you want to add another one?"));

また、呼び出しをエラーチェックする必要がありますscanf()。予期しない入力が与えられた場合、呼び出しが失敗する可能性があります。

また、Cの戻り値をキャストしないmalloc()でください。

于 2013-05-31T09:07:10.723 に答える
2

名前は関数の先頭で 1 回だけ割り当てるため、ループの実行ごとに内容を上書きします。do-while サイクルで割り当てを移動します。

于 2013-05-31T09:07:18.287 に答える
1

割り当てをループ内に移動する必要があります。

name(ちなみに、サイズを制限していないため、scanf への呼び出しはオーバーフローの影響を受けやすくなっています。)

于 2013-05-31T09:12:29.193 に答える
1

次のようにループchar* name = (char*)malloc(sizeof(char)*100);内の行を移動します。do while

do{
    char* name = (char*)malloc(sizeof(char)*100);
    printf("Name: ");
    scanf("%s[^\n]", name);
    fflush(stdin);
    printf("\nPrice: ");
    scanf("%lf", &price);
    fflush(stdin);
    addProduct(&(*head), name, price);
} while(prompt("Do you want to add another one?"));
于 2013-05-31T09:12:07.257 に答える