我目前正在努力测试用户输入的布尔值,如下所示:
function ReadBoolean(prompt: String): Boolean;
var
choice: String;
exit: boolean;
begin
repeat
begin
WriteLn(prompt);
ReadLn(choice);
case choice of
'yes','y','t','true': exit := true;
'no','n','f','false': exit := false;
else
WriteLn('Not a boolean input. Enter again: ');
end;
end;
until exit=true or exit=false;
result := exit;
end;
在收到指定字符串的输入之前,应该保持循环请求值,但是在我第一次尝试输入'fred'时,布尔变量自动被指定为TRUE并退出函数。
非常感谢任何帮助。
答案 0 :(得分:0)
您的循环在exit=true or exit=false
时终止。因为exit
只能是这两个值中的一个,所以它总是满足这个条件,所以它永远不会运行你的循环。
但是,请考虑在开始循环之前明确设置exit := false
的值。
答案 1 :(得分:0)
根据我的理解,您只希望在用户输入某些特定字符串时结束循环。
可以通过修改until
这样的条件来实现:
choice='yes' or choice='y' or choice='t' or choice='true' or choice='no' or choice='n' or choice='f' or choice='false'
或者,创建一个无限循环并在用户输入预期字符串时将其中断:
while true do
...
'yes','y','t','true':
begin
exit := true;
break;
end;
'no','n','f','false':
begin
exit := false;
break;
end;
...
end;
答案 2 :(得分:0)
你在这里问的是“可以为空”的布尔值(值为true,值为false,未提供值)。据我所知,它没有以任何Pascal方言实现。因此,您必须将您的指示拆分为两个单独的标志:a)用户是否提供了格式良好的输入; b)输入被识别为真或假
function ReadBoolean(prompt: String): Boolean;
var
choice: String;
exit: boolean;
recognized: boolean; { this is our termination flag }
begin
recognized := false; { we place it to false initially as no user input recognized yet }
repeat
begin
WriteLn(prompt);
ReadLn(choice);
case choice of
'yes','y','t','true': begin exit := true; recognized := true; end; { we mark it as recognized }
'no','n','f','false': begin exit := false; recognized := true; end; { we mark it as recognized }
else
WriteLn('Not a boolean input. Enter again: ');
end;
end;
until not recognized; { we keep asking for user input until known input provided }
result := exit;
end;