[英]Convert C character into Ruby string
我正在編寫一個示例 C Ruby 擴展,它需要 C 字符到 Z9916D1FC59FE252BC76446A2FE1Z61
我創建了 extconf.rb 和一個名為 x.c 的文件。
extconf.rb:
require 'mkmf'
create_makefile 'x'
x.c:
#include "ruby.h"
void Init_x() {
char c = 'b' ;
VALUE b = rb_str_new_cstr(c) ;
rb_gv_set("$a", b) ;
rb_global_variable(&b) ;
}
rb_str_new_cstr() 需要一個 C 字符串,而不是一個字符。 當我編譯並運行此代碼時,出現分段錯誤,並且 Ruby 崩潰。
我可以這樣做,效果很好:
#include "ruby.h"
void Init_x() {
char *c = "b" ;
VALUE b = rb_str_new_cstr(c) ;
rb_gv_set("$a", b) ;
rb_global_variable(&b) ;
}
但問題是,如果我有類似fscanf(file, "%c", &char)
的東西將char
設置為字符,我必須先將其轉換為字符串並將%c
更改為%1s
,這聽起來有點慢方法。
有沒有辦法直接將 C 字符轉換為 Ruby 字符串?
rb_str_new_cstr()
function 僅適用於以空字符結尾的字符串 - 所謂的 C 字符串(因此是后綴)。 除了各種其他變體之外,無后綴rb_str_new()
function 存在於像您這樣的用例中,其中您有字符並且您知道有多少:
#include "ruby.h"
void Init_x() {
char c = 'b' ;
VALUE b = rb_str_new(&c, 1); // or sizeof(c)
rb_gv_set("$a", b) ;
}
順便提一句。 你不需要在這里調用rb_global_variable()
。 它與 Ruby 全局變量無關。 它用於手動告訴垃圾收集器 Ruby 對象未暴露給 Ruby。 垃圾收集器顯然知道創建的 object 因為字符串可以通過 Ruby 代碼中$a
訪問。
我不會太擔心讀取 1 個字符的性能,但是char *c = "b";
是一個字符串文字,它是不可變的。
如果您遵循重復項,則有許多詳細的答案。
但是,要讀取 1 個字節,您不需要fscanf()
,因為fgetc()
正是這樣做的。
char c[2] = "b"; // 1 character + NULL
c[0] = fgetc(file); // returns the character read
它已經是 C 字符串,你可以傳遞,沒有 & 因為 arrays 衰減到指向它們的第一個元素的指針
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.