簡體   English   中英

將 C 字符轉換為 Ruby 字符串

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM