我有一个简单的用户输入提示,如下所示:
Is this correct? (Y/N):
此提示只应采用Y
或N
,如果输入了任何其他输入,则应重新提示用户。
有人可以告诉我一些关于如何做到这一点的代码片段吗?我对Tcl仍然很新。
答案 0 :(得分:1)
做得好不是很难。关键是在打印提示后记住flush
,检查文件结尾(使用否定结果并调用eof
)并在发生这种情况时采取措施停止并使用-strict
来电string is
。
proc promptForBoolean {prompt} {
while 1 {
puts -nonewline "${prompt}? (Yes/No) "
flush stdout; # <<<<<<<< IMPORTANT!
if {[gets stdin line] < 0 && [eof stdin]} {
return -code error "end of file detected"
} elseif {[string is true -strict [string tolower $line]]} {
return 1
} elseif {[string is false -strict [string tolower $line]]} {
return 0
}
puts "Please respond with yes or no"
}
}
set correct [promptForBoolean "Is this correct"]
puts "things are [expr {$correct ? {good} : {bad}}]"
答案 1 :(得分:0)
您可以使用以下代码段:从stdin(标准输入)获取数据,直到找到有效的内容。
puts "Is this correct? (Y/N)"
set data ""
set valid 0
while {!$valid} {
gets stdin data
set valid [expr {($data == Y) || ($data == N)}]
if {!$valid} {
puts "Choose either Y or N"
}
}
if {$data == Y} {
puts "YES!"
} elseif {$data == N} {
puts "NO!"
}
答案 2 :(得分:0)
我就是这样做的。它不敏感地接受y
,yes
,n
和no
。
proc yesNoPrompt {question} {
while {1} {
puts -nonewline stderr "$question (Y/N): "
if {[gets stdin line] < 0} {
return -1
}
switch -nocase -- $line {
n - no {
return 0
}
y - yes {
return 1
}
}
}
}
yesNoPrompt "Is this correct?"
答案 3 :(得分:0)
好吧,这会接受y,yes,true,1,n,no,false ......
proc isCorrect {} {
set input {}
while {![string is boolean -strict $input]} {
puts -nonewline {Is this correct (Y/N)}
flush stdout
set input [gets stdin]
}
return [string is true -strict $input]
}
if {[isCorrect]} {
puts "Correct"
} else {
puts "not correct"
}