1
#include < stdio.h > 
#include < process.h > 
rec();
main() {
    int a, fact;
    char question, n, y;

    do {
        printf("\nEnter any number ");
        scanf("%d", & a);
        fact = rec(a);
        printf("Factorial value = %d\n", fact);
        printf("do you want to exit.....(y/n):");
        scanf("%s", & question);
    }
    while (question == n);
    exit(0);
}
rec(int x) {
    int f;
    if (x == 1) return 1;
    else f = x * rec(x - 1);
    return f;
}

在这个程序中,我想得到输入数字的阶乘,我得到了。但我也希望用户说出是退出还是获取另一个数字的阶乘,这是我做不到的。它询问用户,但当我输入“n”时它退出。

错误在哪里?

4

2 回答 2

5

你要

while (question == 'n');

或者

char question, n = 'n', y = 'y';

虽然我发现第二个版本有点多余。

无论哪种方式你都需要改变

scanf("%s"

scanf("%c"

正确读取单个char而不是字符串。谢谢愤怒

于 2013-02-27T01:15:19.253 回答
1

一个问题是:

char question, n, y;

scanf("%s", &question);

您正在使用%s将一个以空字符结尾的字符串读入单个字符。即使您点击“y”并返回,您也将覆盖变量末尾之外的内容。不是很好。(好消息是"%s"跳过空格,包括数字后的换行符)。

您要么需要使用"%c"以下格式:

char question;
scanf(" %c", &question);  // NB: The leading space is important!

或者您需要使用字符串格式和字符串变量(并且没有&):

char question[10];
scanf("%9s", question);

如果使用数组,则需要考虑是否使用strcmp(),或者是否比较输入的第一个字符:

while (strcmp(question, "n") == 0);
while (question[0] == 'n');

编译器可能告诉您您没有声明变量n,所以您添加了它。您可能需要循环以while (question == 'n');结尾。and then get rid of the (now) unused variablen (and the currently unused variabley`)。

请注意,如果您使用省略" %c"格式字符串中的空格:

scanf("%c", &question);

那么它通常会在数字之后获得换行符,而不是'n',因此您的循环每次都会退出,显然无需等待您输入任何内容。您可以scanf(" %c", &question);在读取字符之前使用它跳过空格。

您应该scanf()在每次使用时测试是否收到了预期的输入。单项输入的正确测试是:

if (scanf(" %c", &question) != 1)
    ...input failed...

如果您需要区分 EOF 和转换失败,您可以捕获返回 from scanf()

int rc;
if ((rc = scanf(" %c", &question)) != 1)
    ...rc == EOF on EOF; rc == 0 on 'conversion failure'...
    ...a single character input can't easily fail...
    ...but if someone types 'a' instead of '9' when you're looking for a number...

正确使用 I/Oscanf()非常困难。许多有经验的程序员根本不使用它;很难做到正确。相反,我们使用fgets()or POSIXgetline()读取一行数据,然后使用sscanf()它来解析它。这样做有很多优点,但一个主要优点是换行符已被吃掉,因此您不会遇到变量question不包含您期望的答案的问题。

于 2013-02-27T01:21:57.197 回答