即使输入正确的数据,为什么这个条件不起作用?

时间:2013-02-27 01:12:13

标签: c

#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”时它会退出。

错误在哪里?

2 个答案:

答案 0 :(得分:5)

你想要

while (question == 'n');

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

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

无论哪种方式,您都需要更改

scanf("%s"

scanf("%c"

要正确读取单个char而不是字符串。谢谢RageD

答案 1 :(得分: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 variable n (and the currently unused variable y`)结束循环。

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

scanf(“%c”,&amp; question);

那么它通常会在数字之后得到换行符,而不是'n',所以你的循环每次都会退出,显然没有等你输入任何东西。您可以使用scanf(" %c", &question);在阅读角色之前跳过空白区域来进行精细处理。

您应该测试scanf()每次使用时都会收到您期望的输入。单项输入的正确测试是:

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

如果您需要区分EOF和转换失败,您可以从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...

使用scanf()获取I / O权限非常困难。许多有经验的程序员根本就不使用它;做得太难了。相反,我们使用fgets()或POSIX getline()来读取一行数据,然后使用sscanf()来解析它。这有很多优点,但主要的一点是换行已被吃掉,所以你不会遇到变量question不包含你期望的答案的问题。