c++ - 程序不询问预期值的数量

标签 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 个值?虽然只写了3次,但要求的值却是4次。你能说出原因吗?以及如何才能使其获取我正在输入的值的确切数量。?* 提前致谢..

所以我们知道这是由于循环中 %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: %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,2,3,4,...序列getchar/ungetch查看输入缓冲区以查看最先发生的事情是什么接下来 scanf() 将会找到。我还将您的 scanf() 分为两个调用:第一个使用 %d ,第二个使用格式字符串的其余部分(空格和/或 \n)。请注意,\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

关于c++ - 程序不询问预期值的数量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20760914/

相关文章:

c++ - 从 Qt C++ 中的另一个应用程序获取文本字段的值

c++ - C++ 中的简单文本文件加密

c++ - 当 bWaitAll 为 TRUE 时,WaitForMultipleObjects 返回值

c - 我是否需要在 fork 之后在父进程中等待()?

c - 为什么 sizeof(function_name) 是 1

c++ - 应用程序未在未安装 VS 2008 的 PC 上运行

c++ - HttpAddRequestHeaders 添加的 header 和 HttpSendRequest 发送的 header 有什么区别

c - 为什么内核在访问 32 位系统的内核模块中的系统调用表后会出现 panic ?

C代码停止运行

C: strtod 循环,计算空格