[英]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.