0

我有一个简单的用户输入提示,如下所示:

Is this correct? (Y/N): 

此提示应仅采用 aY或 a N,并且如果输入了任何其他输入,则应重新提示用户。

有人可以给我看一段关于如何做到这一点的代码吗?我对 Tcl 还是很陌生。

4

4 回答 4

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}}]"
于 2013-07-25T10:53:39.133 回答
0

您可以使用以下代码段:从标准输入(标准输入)获取数据,直到找到有效的内容。

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!"
}
于 2013-07-24T19:40:05.050 回答
0

我就是这样做的。它不区分大小写地接受、yyesnno

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?"
于 2013-07-24T22:57:52.410 回答
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"
}
于 2013-07-24T23:03:21.453 回答