为什么 strcmp 不能将两个看似相等的字符串识别为相同?
Why doesn't strcmp recognize two seemingly equal strings as the same?
下面是 Matlab 控制台的输出。两个字符串相同:'@TBMA3'
。然而,比较它们时,Matlab 的 strcmp
函数 returns 0
。为什么?
K>> str='@TBMA3'
str =
@TBMA3
K>> method.fhandle
ans =
@TBMA3
K>> strcmp(method.fhandle, str)
ans =
0
最可能的原因是method.fhandle
不是字符串,而是函数句柄。检查 class(method.fhandle)
是否给出
ans =
function_handle
在这种情况下,比较结果为 0
,因为字符串 (str
) 不能等于函数句柄 (method.fhandle
)。
为了检查相等性,您需要将 method.fhandle
转换为字符串,或将 str
转换为函数句柄。第一个选项是不够的,因为 char(function_handle)
会给出 'TBMS3'
,没有 '@'
。所以使用第二个选项,并使用 isequal
:
进行比较
isequal(method.fhandle, str2func(str))
应该给1
.†
† 这个 isequal
比较有效,因为 method.fhandle
和 str2func(str)
都指向同一个已经定义的函数TBMA3
。与 f = @(x)x; g = @(x)x, isequal(f,g)
比较,得到 0
。这种行为是 explained in the documentation。感谢@knedlsepp 帮助澄清这一点。
下面是 Matlab 控制台的输出。两个字符串相同:'@TBMA3'
。然而,比较它们时,Matlab 的 strcmp
函数 returns 0
。为什么?
K>> str='@TBMA3'
str =
@TBMA3
K>> method.fhandle
ans =
@TBMA3
K>> strcmp(method.fhandle, str)
ans =
0
最可能的原因是method.fhandle
不是字符串,而是函数句柄。检查 class(method.fhandle)
是否给出
ans =
function_handle
在这种情况下,比较结果为 0
,因为字符串 (str
) 不能等于函数句柄 (method.fhandle
)。
为了检查相等性,您需要将 method.fhandle
转换为字符串,或将 str
转换为函数句柄。第一个选项是不够的,因为 char(function_handle)
会给出 'TBMS3'
,没有 '@'
。所以使用第二个选项,并使用 isequal
:
isequal(method.fhandle, str2func(str))
应该给1
.†
† 这个 isequal
比较有效,因为 method.fhandle
和 str2func(str)
都指向同一个已经定义的函数TBMA3
。与 f = @(x)x; g = @(x)x, isequal(f,g)
比较,得到 0
。这种行为是 explained in the documentation。感谢@knedlsepp 帮助澄清这一点。