我一直在尝试使用链表进行一些操作,主要是因为我想找到一种方法来确定用户输入确定的序列长度。问题是
[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();
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;
}
答案 0 :(得分:2)
看起来您正在输入一个非数字字符来表示输入结束。但是,scanf()
遇到的第一个不匹配字符留在输入流中。因此,在尝试再次读取输入流之前,需要清除输入流中的额外字符。执行此操作的标准方法是:
int c;
while ((c = getchar()) != '\n' && c != EOF)
continue;
这将丢弃输入流中的字符,直到达到换行符或EOF
。请注意,如果发生错误,getchar()
会返回EOF
,并且用户也可能会输入EOF
,因此必须明确测试它以避免可能的无限循环。