一个问题是:
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", &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
不包含您期望的答案的问题。