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
**
如果分别打印 s1
和 s2
显示出来的结果都是 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
1
共 7 条评论, 1 页
评论区
写评论谢谢!
对以下内容的回复:
对以下内容的回复:
感谢!
我最开始在 PowerShell 直接打印字串,这样看不到那些
\u{0}
。请问有什么方便的办法可以令
s2
的内容成为"hello"
吗?对以下内容的回复:
试一下
println!("{:?}", s2)
,会发现结果是"hello\u{0}\u{0}\u{0}\u{0}\u{0}\u{0}"
,后面多了一串\u{0}
。使用
println!("{} {}",s1.len(),s2.len());
可以看到长度是不同的。我想0字符也被当作有效字符了,所以不同。而trim只去除空白,而0字符严格来说不是空白字符所以无效。s1 是 &str s2 是 String
第一个字符串的切片数组扩容了吧 虽然内容相同 但是容量变了