gpt4 book ai didi

rust - 如何在 Rust 中写入最大缓冲区大小的格式化字符串?

转载 作者:行者123 更新时间:2023-12-05 01:52:10 25 4
gpt4 key购买 nike

当缓冲区大小不足时,write! 似乎不会写入参数。

use std::fmt::Write;
use arrayvec::ArrayString; // 'arrayvec' crate

fn main() {
const SIZE: usize = 16;
let mut s = ArrayString::<SIZE>::new();
match write!(s, "{}{}", "0123456789", "0123456789") {
Ok(_) => println!("success!"),
Err(err) => println!("{}", err),
}
println!("{}", s);
}

输出:

an error occurred when formatting an argument
0123456789

但是,我想写一个尽可能长的格式化字符串,直到缓冲区大小。在上面的例子中,我想要的输出是 0123456789012345

在 C 中,我们可以使用 snprintf 来完成此操作。

#include <stdio.h>
#include <stdlib.h>

int main() {
char buf[16];
snprintf(buf, 16, "%s%s", "0123456789", "0123456789");
printf("%s\n", buf); // output is "012345678901234", due to '\0'
}

我如何在 Rust 中执行此操作?

最佳答案

您可以为特征编写自己的适配器。像这样:

struct FixedWriter<'a, W>(&'a mut W);

impl<'a, W: Write> Write for FixedWriter<'a, W> {
fn write_str(&mut self, s: &str) -> Result<(), std::fmt::Error> {
for c in s.chars() {
self.0.write_char(c)?;
}
Ok(())
}
}

要使用它,只需包装原始作者的可变引用:

write!(FixedWriter(&mut s), "{}{}", "0123456789", "0123456789");

你可以检查这个 playground ,打印 0123456789012345

您还可以通过将 ? 运算符替换为:

if self.0.write_char(c).is_err() {
break;
}

,但是如果你需要这个,问题并不清楚。

关于rust - 如何在 Rust 中写入最大缓冲区大小的格式化字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71678897/

25 4 0
文章推荐: r - 如何在 R 中用函数 image() 制作的热图中覆盖单元格的值?
文章推荐: android - 如何让分频器忽略 Jetpack Compose 中父级的填充?
文章推荐: css - NextJS 中的 组件似乎丢失了带有
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com