String if语句中的字符串比较问题
此字符串比较脚本有问题:String if语句中的字符串比较问题,string,compare,tcl,failing-tests,String,Compare,Tcl,Failing Tests,此字符串比较脚本有问题: set result [string range "0002150C0E67" 8 11 ]; if {[expr {$result != "FFFF" && $result != "0000"}]} {set result "OK byte 5&6 = 0x$result" } {set result "Fail Byte 5&6 = 0x$re
set result [string range "0002150C0E67" 8 11 ];
if {[expr {$result != "FFFF" && $result != "0000"}]} {set result "OK byte 5&6 = 0x$result" } {set result "Fail Byte 5&6 = 0x$result" };
如果我将“0002150C0E67”更改为“0002150C0D67”或“0002150C0F67”(以及许多其他组合),我会得到一个OK结果
怎么了?如果我们查看您的代码:
set result [string range "0002150C0E67" 8 11 ]
此时,result
被设置为字符串0E67
。这是一个看起来像浮点数的字符串,其值为0×1067,即零
现在,简化您的条件(额外的expr
没有添加任何内容)并重新格式化以遵循传统样式(以功能等效的方式),我们得到以下结果:
if {$result != "FFFF" && $result != "0000"} {
set result "OK byte 5&6 = 0x$result"
} else {
set result "Fail Byte 5&6 = 0x$result"
}
如我们所见,第二个not equals比较不满足,因此选择了“Fail”路径。更好的方法是像这样解析字符串:
scan "0002150C0E67" "%8x%4x" -> result
然后,我们对结果和格式进行数值比较,以生成输出:
if {$result != 0xFFFF && $result != 0} {
set result [format "OK byte 5&6 = 0x%04x" $result]
} else {
set result [format "Fail Byte 5&6 = 0x%04x" $result]
}
如果我们查看您的代码:
set result [string range "0002150C0E67" 8 11 ]
此时,result
被设置为字符串0E67
。这是一个看起来像浮点数的字符串,其值为0×1067,即零
现在,简化您的条件(额外的expr
没有添加任何内容)并重新格式化以遵循传统样式(以功能等效的方式),我们得到以下结果:
if {$result != "FFFF" && $result != "0000"} {
set result "OK byte 5&6 = 0x$result"
} else {
set result "Fail Byte 5&6 = 0x$result"
}
如我们所见,第二个not equals比较不满足,因此选择了“Fail”路径。更好的方法是像这样解析字符串:
scan "0002150C0E67" "%8x%4x" -> result
然后,我们对结果和格式进行数值比较,以生成输出:
if {$result != 0xFFFF && $result != 0} {
set result [format "OK byte 5&6 = 0x%04x" $result]
} else {
set result [format "Fail Byte 5&6 = 0x%04x" $result]
}
另一种方法是将!=
运算符更改为ne
,以强制进行字符串比较,但这实际上是关于进行整数解析的,所以我们应该坚持下去。您好,多纳尔,非常感谢。它可以工作,现在我们可以再次生成:)另一种方法是更改=
运算符到ne
以强制进行字符串比较,但这实际上是关于进行整数解析的,所以我们应该坚持这样做。您好,多纳尔,非常感谢。它工作了,现在我们可以再次生成:)@glennjackman诀窍是0E67
是一个浮点数。更传统的编写方式是0.0
。是的,如果OP提到0E67
是一种异常现象,那就更清楚了。乍一看,其他两个似乎是不正常的。直到我真正运行了代码,我才意识到出了什么问题。@glennjackman诀窍在于0E67
是一个浮点数。更传统的编写方式是0.0
。是的,如果OP提到0E67
是一种异常现象,那就更清楚了。乍一看,其他两个似乎是不正常的。直到我真正运行了代码,我才意识到出了什么问题。