4

我目前正在阅读 Ivor Horton 的《Beginning C》。无论如何,我的不确定是在继续之前for打印我的声明两次。printf我确定我做错了什么,但我直接从书中复制了代码。如果这很重要,我正在使用 Dev-C++。这是代码...谢谢

#include <stdio.h>
#include <ctype.h>  // For tolower() function  //

int main(void)
{
char answer = 'N';
double total = 0.0;  // Total of values entered //
double value = 0.0;  // Value entered //
int count = 0;

printf("This program calculates the average of"
                       " any number of values.");
for( ;; )
{
    printf("\nEnter a value: ");
    scanf("%lf", &value);
    total+=value;
    ++count;

    printf("Do you want to enter another value? (Y or N): ");
    scanf("%c", &answer);

    if(tolower(answer) == 'n')
        break;
}

printf("The average is %.2lf.", total/count);
return 0;
}
4

3 回答 3

6

如果我们简要地运行您的程序,将会发生以下情况:

  1. 它提示用户输入一个数字。
  2. 用户输入一个数字并按下回车键。
  3. scanf读取数字,但将换行符留在队列中。
  4. 它提示用户输入 Y 或 N。
  5. 它尝试读取一个字符,但不跳过任何空格/换行符,因此它最终消耗了留在队列中的换行符。

显然,我们需要跳过换行符。幸运的是,这很容易,如果不是很明显:在格式字符串的开头添加一个空格,例如:

scanf(" %c", &answer);

格式字符串中的空格表示“在阅读下一件事之前尽可能多地跳过空格”。对于大多数转换,这是自动完成的,但不是字符串或字符。

于 2013-06-28T03:24:43.733 回答
2

更改此行

scanf("%c", &answer);

scanf(" %c", &answer);

该空格将导致 scanf 忽略您输入的字符之前的空格。

空格是在提供数字后按 Enter 键的结果。

于 2013-06-28T03:24:59.860 回答
-1

代码很好,唯一错过的是fflush(stdin);功能之前scanf。它可以总是在scanf函数之前使用以避免这些陷阱。按下“Enter”键的动作将换行符“\n”作为标准输入缓冲区的输入。因此,循环中的第一个 scanf 函数将其假定为输入,并且不等待用户键入值。

#include <stdio.h>
#include <ctype.h>  // For tolower() function  //

int main(void)
{
char answer = 'N';
double total = 0.0;  // Total of values entered //
double value = 0.0;  // Value entered //
int count = 0;

printf("This program calculates the average of"
                       " any number of values.");
while(1)
{
    printf("\nEnter a value: ");
    fflush(stdin);
    scanf("%lf", &value);
    total+=value;
    ++count;

    printf("Do you want to enter another value? (Y or N): ");
    fflush(stdin);
    scanf("%c", &answer);
    if(tolower(answer) == 'n')
        break;
}

printf("The average is %.2lf.", total/count);
getch();
return 0;
}

getch()如果您使用控制台,还可以添加一个功能来查看结果。

于 2013-06-28T03:41:42.437 回答