比较字符时,ischar(x)&& x ==' b'相当于strcmp(x,' b')?

时间:2013-12-30 22:45:47

标签: matlab

在MATLAB中,我经常使用它来检查变量是否包含某个单个字符:

if ischar(x) && x == 'b'

减少混乱我正在考虑改变它:

if strcmp(x, 'b')

因为如果x不是字符或不等同于'b',则比较会返回false,如您所料。这些陈述在这种情况下是相同的还是有问题?

更多信息:x == 'b'是不够的,因为这在x == 98时返回true,但在某些情况下(如验证用户输入),98可能无效输入{{1 } 有效输入。此外,如果b不是标准数据类型(例如,如果它是对象),则第一个失败。拿这个(愚蠢的)例子:

x

这会引发错误,因为没有为表定义x = table(); x == 'b' ,但eq返回0,因为strcmp(x, 'b')似乎也执行了类型检查。是否需要这种异常处理可能取决于具体情况。

3 个答案:

答案 0 :(得分:4)

strcmp是要走的路。 ==运算符是元素方面的。如果x不是单个字符,那么测试将返回logical数组而不是一个:

>> x = 'abc';
>> x == 'b'
ans =
     0     1     0
>> x = 'bbb';
>> x == 'b'
ans =
     1     1     1

两者都不相等,第二个满足if语句。

另请注意,虽然==eq)是元素方面的,但isequal测试对象相等性。需要注意的是,isequal 不会在测试中考虑数据类型。那就是:

>> isequal('abc',[97 98 99])
ans =
     1
>> strcmp('abc',[97 98 99])
ans =
     0
>> eq('abc',[97 98 99])
ans =
     1     1     1

如果您关心数据类型,请使用strcmp,否则请使用isequal

还要考虑使用strcmpi来忽略大小写,或使用strncmp来比较第一个N元素。

答案 1 :(得分:2)

如果数组维度不相等,则它们不一定等效。

打印'true':

if 'bbbb' == 'b'
    fprintf('true\n');
end

这不是:

if strcmp('bbbb', 'b')
    fprintf('true\n');
end

答案 2 :(得分:0)

考虑使用strcmp而不是==运算符的另一个原因:

如果使用==运算符, 当字符串大小不同时,你会收到一个错误, 两者都至少有两个字符。

示例:

>> 'aa'=='bbb'
Error using  == 
Matrix dimensions must agree.

>> strcmp('aa','bbb')
ans = 
0