程序不要求预期的数值

时间:2013-12-24 12:24:31

标签: c++ c

#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的细节,我搜索但无法准确理解那是什么。

5 个答案:

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