###Rust言語上で、C言語のprintfを実現したい。
Windows上でRustをコンパイルする際に、
Rust言語上で、printfを使いたくて以下のようにコードを記述していますが、
error: linking with `link.exe` failed: exit code: 1120
というエラーがでて、コンパイルできません。
printf関数は下記のように定義しております。
printfのシグネチャは
https://docs.rs/printf/0.1.0/printf/
上記より参照しています。
Rust
1pub fn printf_c_string(output : Vec<u8>) -> isize { 2 3 unsafe { 4 extern "C" { 5 fn printf(format: *const c_char, args: *mut c_void) -> String; 6 } 7 8 let c_percent = (CString::new("%s".to_string()).unwrap().as_ptr()) as *const c_char; 9 10 let c_string = (CString::new(output).unwrap().as_ptr()) as *mut c_void; 11 12 printf(c_percent, c_string); 13 } 14 return -1; 15} 16 17 18fn main () 19{ 20 21 let v : Vec<u8> = Vec::new(); 22 printf_c_string(v); 23 24} 25
ちなみに、
cargo.tomlファイルは下記のように定義しています。
toml
1[package] 2name = "rust_ishell" 3version = "0.1.0" 4 5edition = "2018" 6 7# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html 8 9[dependencies] 10ctrlc = "*" 11tempfile = "*" 12tempdir = "*" 13cstr_core = "*" 14libc = "*" 15printf = "*" 16printf-rs = "*" 17 18[profile.release] 19opt-level = 3
ただ、Rustのマニュアルにある、fputs関数は、下記のように記述したところ
動作しています。
Rust
1 2pub 3fn print_c_string(output :Vec<u8>) -> isize { 4 unsafe { 5 extern "C" { 6 fn puts(s: *const c_char) -> c_int; 7 } 8 // Vectorのサイズを取得 9 let output_size: isize = output.len() as isize; 10 11 // VectorからCStringを生成 12 let to_print = CString::new(output); 13 // check_type(&to_print); 14 15 // 無事にCStringを取り出せたとき 16 if (to_print.is_ok() == true) { 17 puts(to_print.unwrap().as_ptr()); 18 return output_size; 19 } else { 20 panic!("{}", to_print.unwrap_err()) 21 } 22 return -1; 23 } 24} 25 26fn main() 27{ 28 let v = Vec::new(); 29 print_c_string(v); 30}
なぜこのように、Cのprintfに固執する理由は、
RustでUTF-8以外の文字列を読み込みたいのです。
上記の Cのfputs関数ですと、
Rust
1let b = fs::File::open(path).unwrap().bytes();
などでbyte単位で読み出して、Vec<u8>としてとりだして、
as_ptr()で puts関数に渡してやると、Shift_jisのままプロンプトで表記ができるのです。
どんなたか、Rust言語上でCのprintfを実現するための方法をご存知でしたらご教授くださいませ。
回答4件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。