< 返回版块

a newcomer 发表于 2020-03-25 23:13

Tags:PartialEq, Eq, String


fn main() {
    let s1 = "hello";

    let mut v = s1.as_bytes().to_vec();
    v.extend(&[0, 0, 0, 0, 0, 0]);

    let s2 = String::from_utf8_lossy(&v);

    println!("{}", s1 == s2);
}

** 上面的代码会打印出 false 而不是 true **


如果分别打印 s1s2 显示出来的结果都是 hello 如果把最后一行的表达式改成 s1 == s2.trim() 依然输出 false


Ext Link: https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&code=fn%20main()%20%7B%0A%20%20%20%20let%20s1%20%3D%20%22hello%22%3B%0A%0A%20%20%20%20let%20mut%20v%20%3D%20s1.as_bytes().to_vec()%3B%0A%20%20%20%20v.extend(%26%5B0%2C%200%2C%200%2C%200%2C%200%2C%200%5D)%3B%0A%0A%20%20%20%20let%20s2%20%3D%20String%3A%3Afrom_utf8_lossy(%26v)%3B%0A%0A%20%20%20%20println!(%22%7B%7D%22%2C%20s1%20%3D%3D%20s2)%3B%0A%7D%0A

评论区

写评论
作者 a newcomer 2020-03-26 21:24

谢谢!

对以下内容的回复:

liyiheng 2020-03-26 20:09
    let s2 = s2.trim_end_matches(|c| c as i32 == 0);

对以下内容的回复:

作者 a newcomer 2020-03-26 13:07

感谢!

我最开始在 PowerShell 直接打印字串,这样看不到那些 \u{0}

请问有什么方便的办法可以令 s2 的内容成为 "hello" 吗?

对以下内容的回复:

AlephAlpha 2020-03-26 09:10

试一下 println!("{:?}", s2),会发现结果是 "hello\u{0}\u{0}\u{0}\u{0}\u{0}\u{0}",后面多了一串 \u{0}

xjkdev 2020-03-26 02:20

使用 println!("{} {}",s1.len(),s2.len()); 可以看到长度是不同的。我想0字符也被当作有效字符了,所以不同。而trim只去除空白,而0字符严格来说不是空白字符所以无效。

linsui 2020-03-25 23:55

s1 是 &str s2 是 String

phper-chen 2020-03-25 23:29

第一个字符串的切片数组扩容了吧 虽然内容相同 但是容量变了

1 共 7 条评论, 1 页