4

私はリンクされたリストを初めて使用しますが、ノードの作成にほとんど問題がありません。

ここで、リンクされたリストの最初のノードを設定できましたが、gets()関数は実行を一時停止して次のノードを埋めるようには見えません。

出力は次のようになります。

Var name : var
Do you want to continue ?y
Var name : Do you want to continue ?  // Here I cannot input second data

これが私のコードです:

struct data
{
    char name[50];
    struct data* next;
};
struct data* head=NULL;
struct data* current=NULL;
void CreateConfig()
{
    head = malloc(sizeof(struct data));
    head->next=NULL;
    current = head;
    char ch;
    while(1)
    {
        printf("Var name : ");
        gets(current->name);    //Here is the problem,
        printf("Do you want to continue ?");
        ch=getchar();
        if(ch=='n')
        {
            current->next=NULL;
            break;
        }
        current->next= malloc(sizeof(struct data));
        current=current->next;
    }
}
4

3 に答える 3

7

これは、次の理由で発生します。

ch=getchar();

yまたは入力から読み取り、次の反復で読み取られる入力バッファーに改行がn割り当てられます。chgets

y/nこれを修正するには、ユーザーが入力した後に改行を消費する必要があります。これを行うには、次のように別の呼び出しを追加できますgetchar()

ch=getchar(); // read user input
getchar();    // consume newline

また、関数fgetsは の代わりに使用する必要がありgetsます。なんで?

于 2011-11-21T18:41:39.377 に答える
2

それはまさに@codaddicが言ったことです。バッファをきれいにする必要があります。

void fflushstdin( void )
{
    int c;
    while( (c = fgetc( stdin )) != EOF && c != '\n' );
}

それを非常によく説明しているこのリンクを読むことができます:

  1. よくある質問
  2. Windows を使用している場合は、このmdsnを使用します。

もう 1 つ、gets の代わりに常に fgets を使用するようにしてください。gets を使用している場合、バッファー オーバーフローを防ぐことは不可能です。

このリンクで「安全なライブラリの使用」セクションを読むことができます

于 2011-11-21T18:51:30.170 に答える
0

次のような行も追加する必要があります

 current->next = 0;

 current=current->next;

最後の要素の次の要素がぶら下がっていないことを確認します。

于 2011-11-21T18:54:53.497 に答える