比较字符串的TCL程序

时间:2012-11-24 18:33:36

标签: tcl

我正在尝试创建一个程序,比较第一个和最后一个字符,比较第二个和第二个字符,比较第三个和第三个到最后一个,依此类推,如果这些字符中的任何一个匹配,这两个将被转换为该字符的大写。

示例:

请输入文字:你好菲律宾 决赛:HEllo PhIlippinEs

我无法创建任何代码,我坚持使用

puts "Please enter text:"
set myText [gets stdin]

string index $myText 4 

有人能帮助我吗?

2 个答案:

答案 0 :(得分:3)

此程序还会将菲律宾的第一个i大写,因为它与字符串的开头和结尾等距。

proc compare_chars {str} {
    set letters [split $str ""]
    for {set i [expr {[llength $letters] / 2}]} {$i >= 0} {incr i -1} {
        set a [lindex $letters $i]
        set b [lindex $letters end-$i]
        if {$a eq $b} {
            lset letters $i [set L [string toupper $a]]
            lset letters end-$i $L
        }
    }
    join $letters ""
}
puts [compare_chars "Hello Phillipines"]
# outputs =>  HEllo PhIllipinEs

答案 1 :(得分:2)

对此进行编码的最简单方法是在分割字符上使用foreach。 (这在形式上并不是最有效的,但正确编码非常容易。)

puts "Please enter text:"
set myText [gets stdin]

set chars [split $myText ""]
set idx 0
foreach a $chars b [lreverse $chars] {
    if {[string equals -nocase $a $b]} {
        lset chars $idx [string toupper $a]
    }
    incr idx
}
set output [join $chars ""]

puts $output

请注意,foreach正在迭代列表的副本;并发修改没有问题。实际上,编码视角中唯一模糊不清的部分实际上是我们需要在上面的idx变量中跟踪要修改的索引。


使用Tcl 8.6,你可以写:

set chars [split $myText ""]
set output [join [lmap a $chars b [lreverse $chars] {
    expr {[string equals -nocase $a $b] ? [string toupper $a] : $a}
}] ""]

这取决于是否有新的lmap命令。


如果你真的坚持使用8.3(它的不支持并且已经存在多年,那么你应该优先升级到更新的东西)然后试试这个:

set chars [split $myText ""]
set idx [llength $chars]
set output {}
foreach ch $chars {
    if {[string equals -nocase $ch [lindex $chars [incr idx -1]]]} {
        append output [string toupper $ch]
    } else {
        append output [string tolower $ch]
    }
}

这种使用的所有功能都出现在8.3中(尽管有些功能比以后的版本慢得多)。