Scanf在C中重复出现

时间:2016-09-01 19:06:26

标签: c

这是一个简单的程序,用户输入一系列数字然后添加。结果将打印在屏幕上。这是代码:

int main() {
int * numbers;
int result = 0;
int howMany;
int i;

printf("How many numbers would you like to add?\n");
scanf(" %d\n", &howMany);

numbers = (int *) malloc(howMany * sizeof(int));

for(i = 0; i < howMany; i++){
    printf("Please enter number %d.\n", i + 1);
    scanf(" %d\n", &numbers[i]);
    result = result + numbers [i];
}
printf("Result: %d", result);
return 0;
}

但是有一个问题。该程序询问用户由于某种原因想要添加两次的数量。这是为什么?我该如何解决? 此外,不确定这是否相关,但结果也没有意义。有时它们是正确的,有时它们不是,也不确定为什么。 感谢。

2 个答案:

答案 0 :(得分:2)

  

该程序询问用户由于某种原因想要添加两次的数字。这是为什么?我该如何解决?

你的程序只提示我一次有多少个数字。但是,在我输入之前,它会推迟询问每个特定的数字,然后在输出结果之前,在最后一个(延迟)提示之后需要一个额外的非空行。

  

另外,不确定这是否相关,但结果也没有意义。有时它们是正确的,有时它们不是,也不确定为什么。

这是相关的:每个号码提示迟到这一事实让您对正在添加的号码感到困惑。

这一切都归结为scanf()格式,正如@Mark已经评论过的那样(尽管有些简洁)。以scanf()格式的任何非空白空格(包括换行符)都会匹配可能为空的空格。当匹配这样的运行时,scanf()必须继续扫描,直到它看到非空白字符。但是,交互式输入是行缓冲的,因此在您发送一个全新的行之前,没有新的输入可用。然后,下一行的第一个非空白字符就绪,等待跟随 scanf()

scanf()使用起来非常棘手,特别是对于交互式输入。它最适合固定格式输入。您可以使用scanf()执行此操作 - @Mark向您展示了如何 - 但此处通常的建议是使用fgets()一次读取一行输入,并且sscanf()(或您选择的其他机制)来解析每一行。即便如此,制作防弹装置也是一个挑战,但是你可以从坚定的基础开始。

答案 1 :(得分:0)

您的问题是因为您在printf和scanf函数中错误地放置了换行符。

以下是您可能正在寻找的代码:

int main() {
  int * numbers;
  int result = 0;
  int howMany;
  int i;

  printf("How many numbers would you like to add?: ");
  scanf("%d", &howMany);

  numbers = (int *) malloc(howMany * sizeof(int));

  for(i = 0; i < howMany; i++){
    printf("Please enter number %d: ", i + 1);
    scanf("%d", &numbers[i]);
    result = result + numbers [i];
  }
  printf("Result: %d\n", result);
  return 0;
}