libc板条箱在Windows上不提供sprintf

libc板条箱在Windows上不提供sprintf,windows,rust,libc,Windows,Rust,Libc,我用Rust编写了一个库,它使用libc板条箱提供的sprintf函数使用C格式。所有东西都可以在macOS和Linux上运行,但它不能在Windows上编译,因为sprintf函数不存在 extern crate libc; use libc::{c_char, c_double, sprintf}; 错误[E0432]:未解析的导入`libc::sprintf` ->src\stdf\u helper\reader\mod.rs:12:13 | 12 |使用libc:{sprintf,c|

我用Rust编写了一个库,它使用libc板条箱提供的sprintf函数使用C格式。所有东西都可以在macOS和Linux上运行,但它不能在Windows上编译,因为sprintf函数不存在

extern crate libc;
use libc::{c_char, c_double, sprintf};
错误[E0432]:未解析的导入`libc::sprintf` ->src\stdf\u helper\reader\mod.rs:12:13 | 12 |使用libc:{sprintf,c|char,c|double}; | ^^^^^^^ | | |根中没有'sprintf' |帮助:模块中存在类似的名称:`isprint`
是否有替代或替代名称?

这可能是一个工具链

您可能正在macOS和Linux*Nix上使用GNU工具链

确保您安装并使用了最新和最好的MSVC工具链

阅读了解更多信息

与C.If相互作用的两个问题之间的区别 您正在使用一个由一个或另一个工具链构建的库,您需要 与适当的防锈工具链相匹配。如果你不确定, 与MSVC合作;这是有充分理由的默认值


在windows上使用MSVC。

这可能是一个工具链

您可能正在macOS和Linux*Nix上使用GNU工具链

确保您安装并使用了最新和最好的MSVC工具链

阅读了解更多信息

与C.If相互作用的两个问题之间的区别 您正在使用一个由一个或另一个工具链构建的库,您需要 与适当的防锈工具链相匹配。如果你不确定, 与MSVC合作;这是有充分理由的默认值


在windows上使用MSVC。

据我所知,您的代码已完全损坏。您正在将格式化数据写入零长度字符串,从而覆盖任意数据。试着在Valgrind这样的工具下运行代码。与编译问题无关,sprintf假设它的第一个参数是一个足够大的缓冲区,而不是您的情况!。这是一个已损坏的函数,您无法安全使用。它似乎未绑定。检查并可能归档一个。也就是说,生锈的关键是避免内存不安全,sprintf可能是C语言中最大的罪犯,几乎不可能正确使用。你不能用一个更现代的格式化函数来代替吗?看起来你只是想用锈迹来写C。。那么为什么不写C呢?项目的业务逻辑包含一些C格式说明符,这些说明符不能应用于Rust format!。我已经写了我自己的逻辑,适用于这一点,但我认为我不能涵盖所有的边缘情况:。我想到的一个边缘案例是输入,比如3242.32,格式为%6d。比较C和Rust的结果:据我所知,您的代码完全被破坏了。您正在将格式化数据写入零长度字符串,从而覆盖任意数据。试着在Valgrind这样的工具下运行代码。与编译问题无关,sprintf假设它的第一个参数是一个足够大的缓冲区,而不是您的情况!。这是一个已损坏的函数,您无法安全使用。它似乎未绑定。检查并可能归档一个。也就是说,生锈的关键是避免内存不安全,sprintf可能是C语言中最大的罪犯,几乎不可能正确使用。你不能用一个更现代的格式化函数来代替吗?看起来你只是想用锈迹来写C。。那么为什么不写C呢?项目的业务逻辑包含一些C格式说明符,这些说明符不能应用于Rust format!。我已经写了我自己的逻辑,适用于这一点,但我认为我不能涵盖所有的边缘情况:。我想到的一个边缘案例是输入,比如3242.32,格式为%6d。比较C和Rust的结果:如果阅读libc平台特定文档,您会注意到导出的函数中没有sprintf:@Carter先生,这是gnu工具链上针对windows的平台特定文档。我找不到使用MSVC工具链的x86_64 windows文档。但是我可以在libc文档中找到sprintf,就在这里。似乎它是特定于平台的。使用MSVC工具链从使用GNU工具链的x86_64 windows更改为使用MSVC工具链的x86_64 windows可以解决上述答案中建议的问题。如果您阅读了特定于libc平台的文档,您会注意到,sprintf不存在于导出的函数中:@Carter先生,这是gnu工具链上针对windows的特定于平台的文档。我找不到使用MSVC工具链的x86_64 windows文档。但是我可以在libc文档中找到sprintf,就在这里。似乎它是特定于平台的。从使用GNU工具链的x86_64窗口更改为使用MSVC工具链的x86_64窗口可以解决上述答案中建议的问题。
let c_resfmt: CString =
    CString::new(c_resfmt).expect("Couldn't convert to c_resfmt to CString ");
let result_buffer: *mut c_char = CString::new("").expect("").into_raw();
unsafe {
    sprintf(result_buffer, c_resfmt.as_ptr(), scaled_result as c_double);
    let formatted_result = CString::from_raw(result_buffer).into_string().unwrap();
    ptr_result.with_result_value(formatted_result);
}