【问题标题】:When comparing characters, is ischar(x) && x == 'b' equivalent to strcmp(x, 'b')?比较字符时,ischar(x) && x == 'b' 是否等同于 strcmp(x, 'b')?
【发布时间】:2013-12-30 22:45:46
【问题描述】:

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

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

为了减少混乱,我正在考虑将其更改为:

if strcmp(x, 'b')

因为如果x 不是字符或不等于'b',则比较返回false,如您所料。在这种情况下,这些语句是等效的还是存在陷阱?

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

x = table();
x == 'b'

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

【问题讨论】:

  • 我对matlab不太了解,但是比较x'b'还不够吗?是否可以等于'b' 而不是char?
  • @CoreyOgburn 是的。 98 == 'b' 在 MATLAB 中返回 true,但出于我的目的,这还不够好,因为在一种情况下(例如),我正在验证用户输入,而 98 将是无效输入。
  • strcmp 是要走的路,正如@chappjc 所回答的那样。请注意,如果x 包含多个字符,ischar(x) && x=='b' 将给出错误。如果您想这样做,请使用ischar(x) && length(x)==1 && x=='b'

标签: matlab


【解决方案1】:

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 元素。

【讨论】:

    【解决方案2】:

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

    这会打印“真”:

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

    这不是:

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

    【讨论】:

    • 啊,好吧,所以在这种情况下,我肯定想要strcmp,因为我想拒绝像'bbbb' 这样的情况。
    【解决方案3】:

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

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

    例子:

    >> 'aa'=='bbb'
    Error using  == 
    Matrix dimensions must agree.
    
    >> strcmp('aa','bbb')
    ans = 
    0
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-02-09
      • 2012-04-02
      • 2014-02-14
      • 1970-01-01
      • 2017-02-09
      • 2012-09-09
      • 2013-12-11
      • 1970-01-01
      相关资源
      最近更新 更多