[英]Strange skipping concerning 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();
有关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;
}
看起来您正在输入一个非数字字符来表示输入结束。 但是, scanf()
遇到的第一个不匹配字符留在输入流中。 因此,您需要在尝试再次读取输入流之前清除输入流中的额外字符。 执行此操作的标准方法是:
int c;
while ((c = getchar()) != '\n' && c != EOF)
continue;
这会丢弃输入流中的字符,直到到达换行符或EOF
。 请注意, getchar()
在发生错误时返回EOF
,并且用户也可能输入EOF
,因此有必要对其进行显式测试以避免可能的无限循环。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.