【问题标题】:Why two strings with the same characters do not return 0 when compared?为什么两个具有相同字符的字符串在比较时不返回 0?
【发布时间】:2015-08-07 23:44:59
【问题描述】:

大家好,我正在尝试比较两个字符串。 str1 是从 serialPort 读取的,而 str2 是参考字符串。代码:

string str1 , str2 = "Foo";
serialPort1.Open();
str1 = serialPort1.ReadLine(); //I get "Foo" on the serial port.

if (String.Compare(str1,str2) == 0)
{ 
     //do something
}

所以字符串具有相同的值,但 if 语句中的代码不会运行。 如果我像这样更改 if 语句:

if (String.Compare(str1,str2) != 0)
{ 
     //do something
}

代码将完美运行!所以我不明白这里有什么问题?是不是编码有问题之类的?

【问题讨论】:

  • 你确定从串口获取的数据不包含特殊字符并且你使用了好的编码?
  • 试试if(str1.Trim() == str2.Trim())验证间距问题,也可以比较长度。
  • @Graffito:我还没有更改编码,实际上一切都是默认方式。
  • @cDima:我试过了,还是不行,我不明白为什么会有空格?谢谢
  • 你检查过str1.Length吗?是否像您期望的那样等于“Foo”的 3?

标签: c# string serial-port compare


【解决方案1】:

能否将字符串内容显示如下:

dump(System.Text.Encoding.UTF8.GetBytes(str1)) ;
dump(System.Text.Encoding.UTF8.GetBytes(str2)) ;
dump(System.Text.ASCIIEncoding.Default.GetBytes(str1)) ;
dump(System.Text.ASCIIEncoding.Default.GetBytes(str2)) ;

private void dump(byte[] bytes)
{ // HexaDecimal display
  console.writeln(BitConverter.ToString(bytes)) ;
}

【讨论】:

  • 谢谢,这是一个很好的提示,我很感激,我得到“46-6F-6F-0D”作为串行端口的字符串,我参考的十六进制代码是“46-6F -6F”。那么“0D”十六进制代表什么?那显然不是空格……我现在该怎么办?
  • "0D" 是回车。在 ReadLine() 之后,执行 str1=str1.Replace("\r","") ;
  • @J.Doe - 不要忘记将答案标记为已接受的答案,以防它帮助您解决问题。
  • @Graffito - 是的,它有效......谢谢!如何直接使用十六进制代码而不是“\r”(回车运算符)来完成这种替换?
  • @Yakimych:我应该如何将此标记为答案?我对此一无所知!
【解决方案2】:

您可以使用 Equals 进行比较。

在你的情况下:

if(str1.Equals(str2))
{
    //do stuff
}
else
{
    //do other stuff
}

也许最好打印字符串并查看实际值是什么。也许他们确实是不同的。

【讨论】:

  • 为了将来参考,您可以通过在前后添加`字符来格式化您的代码,例如:code here,或者选择并按下Ctrl-K
猜你喜欢
  • 1970-01-01
  • 2015-06-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-17
  • 1970-01-01
  • 1970-01-01
  • 2016-12-18
相关资源
最近更新 更多