程序不询问预期的值数

Program not asking expected number of values

本文关键字:程序      更新时间:2023-10-16
#include <stdio.h>
main()
{
int n,i;
FILE *fptr;
fptr=fopen("f3.txt","w");
if(fptr==NULL)
{
printf("Error!");
exit(1);
}
printf("Enter n: ");
for(i=0;i<=2;i++)
{
scanf("%d n",&n);
fprintf(fptr,"%d ",n);
}
fclose(fptr);
return 0;
}

编辑:*在上面的程序中,我输入了3个值,但为什么这要求4个值?虽然它只写了三次,但它要求值 4 次。你能说出d原因吗?以及如何让它取我正在输入的确切数量的值。?*提前感谢..

所以这是由于循环中 %d 旁边的空格造成的。有人可以详细解释一下回车吗,我搜索了一下,但无法确切理解那是什么。

您输入的不是 4 个值,而是 3 个。for语句贯穿 0、1 和 2。如果看起来要求您输入 4 个值是因为您在scanf()中使用的格式字符串。只需使用"%d",没有尾随空格和n

另外,我可以建议你在scanf()之前重复printf ("Enter n: ");,而不仅仅是在你的程序开始时?这样,您将很快意识到程序何时要求您提供数据,或者当scanf()刚刚卡住等待一些尾随数据(例如回车)以接受以前的数据时。

如果你按照我告诉你的改变printf并且不更改scanf()格式字符串,你会意识到你的程序要求第一个数字,然后要求回车(你以为这里它要求你提供一个数字,然后输入一个,你的"第二个"数字),然后要求第二个数字(第三个数字给你, 但是这个scanf()将接受您之前输入的第二个数字),然后是第三个数字(第四个给您,但这个scanf()将接受输入的前第三个数字)。这是用户的 4 个输入,这就是让您感到困惑的地方。

为了尝试解释您的 scanf() 最初发生的事情,我基于您的程序编写了一个程序,但增加了一些内容:

#include <stdio.h>
int main()
{
int n,i,c;
for(i=0;i<=2;i++)
{
printf ("  scanf #%d (%%d) n", i+1);
scanf("%d",&n);
printf ("  Read: %dn",n);
c = getchar();
printf ("  Last character in input buffer: %.2Xn", c);
printf ("  scanf #%d (space and \n) n", i+1);
scanf(" n"); /* or t or just the space, or just n */
c = getchar();
printf ("  Last character in input buffer: %.2Xn", c);
ungetc (c, stdin);
}
return 0;
}

每次程序静止时,用户都会输入一个数字:1,2,3,4,...序列getchar/ungetch查看输入缓冲区,以查看下一个scanf()将发现的第一件事是什么。我还将您的scanf()拆分为两个调用:第一个使用%d,第二个使用格式字符串的其余部分(空格和/或n)。请注意, 被视为空格。事实上,两者都是所谓的空白字符的一部分,因此它们中的任何一个行为都相同,并且多个空白的行为就像只有一个空白)

这就是发生的事情(左边的数字是我从键盘输入的数字):

scanf #1 (%d)
1
Read: 1
Last character in input buffer: 0A
scanf #1 (space and n)
2
Last character in input buffer: 32
scanf #2 (%d)
Read: 2
Last character in input buffer: 0A
scanf #2 (space and n)
3
Last character in input buffer: 33
scanf #3 (%d)
Read: 3
Last character in input buffer: 0A
scanf #3 (space and n)
4
Last character in input buffer: 34
END OF PROGRAM

将此输出与此输出进行比较:

scanf #1 (%d)
1 2 3 4  <-- I enter 4 numbers at the first prompt, instead of one at a time
Read: 1
Last character in input buffer: 20
scanf #1 (space and n)
Last character in input buffer: 32
scanf #2 (%d)
Read: 2
Last character in input buffer: 20
scanf #2 (space and n)
Last character in input buffer: 33
scanf #3 (%d)
Read: 3
Last character in input buffer: 20
scanf #3 (space and n)
Last character in input buffer: 34
END OF PROGRAM

将 for 循环更改为,然后您可以输入 4 个值

for(i=0;i<=3;i++)
{
scanf("%d n",&n);
fprintf(fptr,"%d ",n);
}

试试这个

#include <stdio.h>
main()
{
int n,i;
FILE *fptr;
fptr=fopen("f3.txt","w");
if(fptr==NULL)
{
printf("Error!");
exit(1);
}
printf("Enter n: ");
for(i=0;i<=3;i++)
{
scanf("%d n",&n);
fprintf(fptr,"%d ",n);
}
fclose(fptr);
return 0;
}

您的代码仅采用 3 个值,而不是 4 个值。

for(i=0;i<=2;i++)

上面的循环运行 0、1 和 2,即 3 次。

for(i=0;i<=2;i++)只循环 3 次,将其更改为for(i=0;i<4;i++)并回答您的编辑::将scanf("%d n",&n);更改为scanf("%d",&n);(%d后发现空间差异)。