这是一个简单的程序,用户输入一系列数字然后添加。结果将打印在屏幕上。这是代码:
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;
}
但是有一个问题。该程序询问用户由于某种原因想要添加两次的数量。这是为什么?我该如何解决? 此外,不确定这是否相关,但结果也没有意义。有时它们是正确的,有时它们不是,也不确定为什么。 感谢。
答案 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;
}