#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旁边的空格所致。有人可以解释一下Carriage Return的细节,我搜索但无法准确理解那是什么。
答案 0 :(得分:8)
您没有输入4个值,但是3. for
语句运行0,1和2.如果看起来要求您输入4个值是因为您在{{1}中使用的格式字符串}}。只需使用scanf()
,不使用尾随空格和"%d"
。
此外,我是否可以建议您在\n
之前重复printf ("Enter n: ");
,而不仅仅是在您的计划开始时?这样,您很快就会意识到程序何时要求您提供数据,或者当scanf()
刚刚等待某些尾随数据时,例如回车,以接受以前的数据。
如果您按照我的说法更改scanf()
并且不更改printf
中的格式字符串,您将意识到您的程序要求输入第一个数字,然后要求回车(你在想这里要求你输入一个号码,输入一个,你的“第二个”号码,然后要求输入第二个号码(第三个号码给你,但是这个scanf()
会接受你先前输入的第二个号码) ,然后是第三个数字(第四个给你,但是这个scanf()
将接受先前输入的第三个数字)。这是用户的4个输入,这让你很困惑。
为了尝试解释你最初拥有它的scanf()发生了什么,我写了一个基于你的程序,但增加了一些:
scanf()
每次程序仍然存在时,用户输入一个数字:1,2,3,4,...序列#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: %d\n",n);
c = getchar();
printf (" Last character in input buffer: %.2X\n", 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: %.2X\n", c);
ungetc (c, stdin);
}
return 0;
}
查看输入缓冲区以查看下一个{{1}的第一个内容} 会发现。我还将您的getchar/ungetch
分成两个调用:第一个使用scanf()
,第二个使用其余的格式字符串(空格和/或scanf()
)。请注意\ n被视为空格。事实上,两者都是所谓的空白字符的一部分,所以它们中的任何一个都表现相同,并且多个空白的行为就像只有一个空白一样)
这就是发生的事情(左边的数字是我从键盘输入的数字):
%d
将此输出与此输出进行比较:
\n
答案 1 :(得分:1)
将您的for循环更改为,然后您可以输入4个值
for(i=0;i<=3;i++)
{
scanf("%d \n",&n);
fprintf(fptr,"%d ",n);
}
答案 2 :(得分:1)
试试这个
#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 :(得分:0)
您的代码只需要3个值,而不是4个。
为(I = 0; I&LT; = 2;我++)
上述循环运行0,1和2,即3次。
答案 4 :(得分:0)
仅for(i=0;i<=2;i++)
循环3次,将其更改为for(i=0;i<4;i++)
并将修改后的答案更改为:: scanf("%d \n",&n);
更改为scanf("%d",&n);
(找出空格后的差异%d
)。