我创建了一个堆栈来解决问题。这是插入函数:
insert()
{
char data;
scanf("%c",&data);
struct node* newNode=create_node(data);//creates a new node
if(head==NULL)
{
head=newNode;
tail=head;
return;
}
newNode->next=head;
head=newNode;
return;
现在,我尝试像这样在堆栈中推送一些元素,
main()
{
char input[20];
insert();
insert();
insert();
insert();
insert();
print();
}
但是我注意到每次插入后都会跳过 insert 。所以当我需要 5时,它只需 3 输入 ..即,我在输入3个输入后给出输出。
我能够通过在插入功能中添加 fflush 来解决问题。
我想知道实际发生了什么导致这个...... 这是否意味着我们不能像我一样接受输入?
答案 0 :(得分:4)
替换
scanf("%c", &data);
与
scanf(" %c", &data);
解决问题。 %c
后面的空格字符会跳过所有空格字符,包括无,直到C11标准中指定的第一个非空白字符:
7.21.6.2 fscanf功能
[...]
- 由空白字符组成的指令通过读取第一个非空白字符(仍然未读取)的输入来执行,或者直到不再能够读取字符为止。该指令永远不会失败
醇>
您的程序仅使用3个输入而不是5个输入的原因是因为标准输入流(\n
)中存在换行符(stdin
)。记住在输入scanf
的数据后按 Enter ?此\n
捕获的此字符(换行符或scanf
)不。当scanf
与%c
下次调用时,此角色会被scanf
捕获。这就是为什么fflush
不等待进一步输入并“跳过”某些输入的原因。
函数stdin
与fflush
一起使用时,可能在某些实现中工作,尽管该行为被称为标准未定义:
7.21.5.2 fflush功能
[...]
- 如果流指向未输入最新操作的输出流或更新流,则{{1}}函数会将该流的任何未写入数据传递到主机环境以写入文件;否则,行为未定义。
醇>