我有一个简单的用户输入提示,如下所示:
Is this correct? (Y/N):
此提示应仅采用 aY
或 a N
,并且如果输入了任何其他输入,则应重新提示用户。
有人可以给我看一段关于如何做到这一点的代码吗?我对 Tcl 还是很陌生。
我有一个简单的用户输入提示,如下所示:
Is this correct? (Y/N):
此提示应仅采用 aY
或 a N
,并且如果输入了任何其他输入,则应重新提示用户。
有人可以给我看一段关于如何做到这一点的代码吗?我对 Tcl 还是很陌生。
做好并不是很难。关键是要记住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}}]"
您可以使用以下代码段:从标准输入(标准输入)获取数据,直到找到有效的内容。
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!"
}
我就是这样做的。它不区分大小写地接受、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?"
好吧,这将接受 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"
}