0

リンクリストのコードを書きました:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct student{
       char name[256];
       int id;  
       struct student *next;
};
  struct student *start;
  struct student *last;     

void enter(void);
void add( struct student *i,struct student **last);
void display(struct student *first);       

int main(int argc, char *argv[])
{
  start=last=NULL;

   enter();
   enter();
   enter();
   display(start);

  system("PAUSE");  
  return 0;
}

void add( struct student *i,struct student **last)
{
     if (!*last){ *last=i; start=i;}
     else {(*last)->next=i;*last=i;}
     i->next=NULL;

     }
void enter(void)
{
   struct student *info;

   info=(struct student *)malloc(sizeof(struct student));



    printf("Enter the name of the student:\n");
    fgets(info->name,255,stdin);
    fflush(stdin);
    // gets(info->name);
     printf("Enter the student id:\n");
     scanf("%d%",&info->id); 
     add(info,&last);

 }

 void display(struct student *first)
 {
      while(first)
      {
                  printf("\n\n\n\nName: %s\n",first->name);
                  printf("Id: %d\n", first->id);
                  first=first->next;
                  }
  }

リンクされたリストを作成しますが、値を入力しようとすると、次のように表示されます

出力

最初の要素では、ID の名前を正しく取得します。ID の数字の後に \n を手動で入力する必要があります (そうしないと、scanf モードから抜け出せません)。2 番目の要素以降は、名前を取得するように求められず、「Enter」をスキップします。 name" を入力し、手動で \n を入力する必要がある ID を要求します。リンクされたリスト要素を表示している間、最初の名前は表示されますが、2 番目以降の名前は \n と表示されます。私はすでに fflush(stdin) を使用しています。なぜそのような行動をするのか教えてください。o/pの写真を添付し​​ました。

ありがとう

4

1 に答える 1

2

ニッケルがあれば…

とにかく、ここには多くの問題があります。

1)しないでくださいfflush(stdin)、それは未定義の動作です

scanf2) s とsを混在させることは決して良い考えではありませんfgets。混乱を招くだけです。

scanf(" %s", info->name); // will do instead of your fgets statement

%3) scanfに余分なものがあります:

scanf("%d%",&info->id);  // should be scanf("%d",&info->id);

完全を期すために...

あなたが今問題を抱えている理由:

fgets()は文字列を取り、改行を含むので、名前を尋ねているときに「名前\n」が得られます

scanf()番号を取り、改行を残します。したがって、ID を要求すると、数字が入力されますが、改行文字'\n'はまだstdin.

次回fgets()実行すると、2 番目の名前の入力として自動的に取得されます。入力要求を「スキップ」しているようです。


編集
使用していた理由がfgets()、スペースを含む文字列 ( など"first_name last_name")を読み取ることであった場合、これはscanf()Negated scanset オプションを使用して同様に実行できます。

scanf(" %[^\n]",info->name); 
于 2012-12-12T18:56:09.140 に答える