#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”时它会退出。
错误在哪里?
答案 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
不包含你期望的答案的问题。