关于scanf()

时间:2017-01-05 23:06:24

标签: c while-loop linked-list scanf

我一直在尝试使用链表进行一些操作,主要是因为我想找到一种方法来确定用户输入确定的序列长度。问题是

终端输出

[filip@filip PointerCheck]$ ./PointerCheck.o 
Enter number to populate the list..
1 2 3
c
Enter number to populate the list..
Printing...
1 2 3 
3

为什么跳过列表的第二个人口?

我尝试了多种方法,我认为问题存在于while循环条件的某个地方,关于scanf();
列表函数应该正常工作,因为来自add_to_list()的单独调用确实在列表中插入了一个整数,并且print_list()打印了所有这些。所以我猜,它必须是while循环,特别是scanf();

C代码

void user_input_list(void) {
  int *input = NULL;
  input = (int *) malloc(sizeof(int));
  printf("Enter number to populate the list..\n");
  while (scanf("%d", input)) {
    add_to_list(*input, 1);
  }
}

int main(int argc, char const *argv[]) {
  int i = 0;
  struct node *ptr = NULL;

  user_input_list();

  user_input_list();

  print_list();
  printf("%d\n", lenght_list());

  return 0;
}

以下是整个文件,实时 [link]pastebin

1 个答案:

答案 0 :(得分:2)

看起来您正在输入一个非数字字符来表示输入结束。但是,scanf()遇到的第一个不匹配字符留在输入流中。因此,在尝试再次读取输入流之前,需要清除输入流中的额外字符。执行此操作的标准方法是:

int c;

while ((c = getchar()) != '\n' && c != EOF)
    continue;

这将丢弃输入流中的字符,直到达到换行符或EOF。请注意,如果发生错误,getchar()会返回EOF,并且用户也可能会输入EOF,因此必须明确测试它以避免可能的无限循环。