我的一个朋友正在尝试学习c(单独使用一本书),有时她会求助。
她只是向我展示了一些我无法回答的事情;我很惭愧,但我在大学学习C然后转移到PHP。我真的被卡住了所以我想知道为什么我们不能得到三个输入。这是部分代码:
#include <stdio.h>
int main()
{
int num1;
int num2;
char x;
printf("Enter a number:\n");
scanf("%d\n",&num1);
printf("Enter another number:\n");
scanf("%d\n",&num2);
printf("Choose an operation sign:\n");
scanf("%c\n",&x);
...
像这样,它要求第一次输入两次,如下所示:
Enter a number:
1
2
Enter another number:
3
Choose an operation sign:
-
如果我删除\n
,则会跳过上一个scanf
。
你能帮我理解为什么吗?
答案 0 :(得分:4)
请在此处阅读:scanf() leaves the new line char in buffer?
解决方案:
int main()
{
int num1;
int num2;
char x;
printf("Enter a number:\n");
scanf("%d",&num1);
printf("Enter another number:\n");
scanf("%d",&num2);
printf("Choose an operation sign:\n");
scanf("\n%c",&x); /* See the \n <---------------- */
}
替代方案:
char buf[2]; /* We need 2 characters for the null */
scanf("%1s", buf); /* We ask max 1 character (plus null given by scanf) */
char x = buf[0]; /* We take the first character */
作为一个小注释,感谢scanf
的工作原理,使用这两种解决方案,您可以直接在第一个“输入”中插入所有数据,而各种scanf
将会参与其中。因此,您可以插入123 234 +
,它将在三个变量中正确分割。
答案 1 :(得分:1)
是的,scanf
不会删除换行符,也无法刷新stdin
,那么如何:
int num1;
char nleater;
printf("Enter a number:\n");
scanf("%d%c", &num1, &nleater);
或者确实如此:
printf("Enter number sign number: ");
scanf("%d %c %d",&num1,&x,&num2);
printf("%d %c %d", num1, x, num2);
答案 2 :(得分:0)
您也可以尝试使用fflush
,但这取决于库实现(stdio)。
可以找到它的C引用here。
稍后我会对此进行测试并更新我的帖子并说明它是否有效。