字段说明符如何在C中工作

时间:2014-12-27 06:29:47

标签: c

我需要从用户获取两个int值。第一个值是使用字段说明符,第二个值是正常的整数值。

#include<stdio.h>
int main()
{
    int num, num1;
    printf("Enter first number: \n");
    scanf("%2d", &num);
    printf("First number is %2d\n", num);

    printf("Enter second number: \n");
    scanf("%d", &num1);
    printf("Second number is %d\n", num1);
    return 0;
}

,输出

Enter first number: 
12345
First number is 12
Enter second number: 
Second number is 345

它无法控制输入第二个号码。我不知道为什么?

5 个答案:

答案 0 :(得分:5)

您会看到此行为,因为您限制了第一个scanf语句可以使用的输入大小。 scanf("%2d", &num)表示scanf应该读取最多2的宽度字段,并将其转换为num

scanf更改为scanf("%d", &num),我们将处理整个12345

答案 1 :(得分:4)

你不能输入第二个数字,因为你的程序是从第一个数字中获得的。

首次,您的scanf允许您的num获取您输入的数字的前两位数字,其余部分保留在缓冲区/流中。 下次执行scanf时,它会从流中读取剩余数字直到输入笔划,因此您无法输入第二个数字。

如果你想读第二个没有。 尝试在使用第二个scanf()之前刷新流,你会得到你想要的。

答案 2 :(得分:2)

为什么你会期望它能够控制&#34;?第一个scanf()明确地消耗了最多两位数,留下了&#34; 345&#34;未消费。下一次扫描以未消耗的输入开始。您还期待什么?

如果要在下次扫描前丢弃任何未使用的输入,请使用fpurge(stdin)。

答案 3 :(得分:1)

始终需要与scanf进行权衡。如果您想输入整数,然后使用尾随newline(在input buffer (stdin)左侧作为按[enter]的结果),您可以添加{ {1}} 读取并放弃尾随换行符。如果输入空字符串,这本身会导致问题。

但是,将%*c限制为scanf format string and specifier然后输入%2d,您将123456保留在3456\n中,该input buffer被视为输入到第二个scanf来电。保证每个scanf来电的唯一方法是只接受您的预期输入,即在每次input buffer读取后手动清空scanf,以确保在下一个之前没有剩余字符呼叫。一种简单的方法是使用do .. while或只使用while ;使用getchar()来阅读stdin中的每个字符,直到遇到'\n'或{ {1}}:

EOF

<强>输出:

#include<stdio.h>
int main()
{
    int c, num, num1;
    printf("Enter first number: \n");
    scanf("%2d", &num);
    while ((c = getchar()) && c != '\n' && c  != EOF) ;
    printf("First number is %2d\n", num);

    printf("Enter second number: \n");
    scanf("%d", &num1);
    printf("Second number is %d\n", num1);
    return 0;
}

答案 4 :(得分:0)

第二个值的原因并非来自你,在第一次扫描中你提到了这一点 从输入中获取两个值。您将剩余值存储在缓冲区中的时间超过两次。所以第二个scanf将从缓冲区中获取值。

如果您想避免这种情况,可以在第二次扫描之前使用此语句。

 while ((c=getchar())!='\n' && c!=EOF);// clearing the buffer.

所以现在第二个输入将来自用户。