【发布时间】:2019-06-13 18:30:55
【问题描述】:
我正在尝试创建一个函数来获取“y”或“n”的用户输入。
#include <stdio.h>
#include "userinput.h"
bool userinput_get_yes_or_no(char message[]) {
printf("%s [y/n]: \n", message);
char answer;
scanf_s(" %c", &answer, 1);
if (answer == 'y') return true;
if (answer == 'n') return false;
return userinput_get_yes_or_no(message);
}
当用户只输入“y”、“n”时效果很好。 当您输入任何其他内容(但只有 1 个字符)时,它会重复问题并打印一次消息。
但是 当您输入超过 1 个字符的内容时,该消息会重复多次(与您输入的字符一样多次),然后再等待输入。
我做错了什么?
【问题讨论】:
-
假设(因为可以测试和确认/拒绝):字符已经输入到控制台/std-in,并且在消耗之前不会被丢弃。所以 "yy
" 将导致读取 两个 'y' 字符,每次调用一个,因为一次只消耗一个字符。 -
糟糕的递归使用。使用简单的 do-while 循环。
-
“我做错了什么” - 你似乎假设
scanf_s(" %c", &answer, 1);在阅读stdin时会神奇地清除所有字符,包括空格和非空格,除了第一。那不是它的作用。如果您输入“abc”并提取“a”,则输入流中还剩下“bc”,并且您的循环愉快地为每次迭代消耗一个。 -
首先使用
scanf... -
scanf表示“读取下一个可用字符”,而不是“等待输入”(粗略地说)