我不明白为什么我不能在c中获得三个输入

时间:2011-10-19 09:05:42

标签: c scanf

我的一个朋友正在尝试学习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

你能帮我理解为什么吗?

3 个答案:

答案 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

稍后我会对此进行测试并更新我的帖子并说明它是否有效。