おんがえしの blog

作ったプログラムと調べた技術情報

mrubyの文字列をC言語から参照するときはmrb_string_value_ptr()ではなくmrb_string_value_cstr()を使う

src = Clipboard.get.split("\n")

src.each do |e|
  p e
  puts e
  puts
end

みたいなコードを書いているときに、pだと正しく表示されるけどputsだと後ろの文字列が一緒に表示されてしまうときがあった。

# クリップボードの内容は"foo\nbar\nbaz\n"とする
"foo"
foo
bar
baz

"bar"
bar
baz

"baz"
baz

調べていくと、C言語内でmrubyの文字列を参照しているときにmrb_string_value_ptr()を使っているのが原因だった。NULL終端された文字列が確実に欲しいときはmrb_string_value_cstr()を使う必要がある。

慌ててRubyPico全体をgrepして、ひととおりmrb_string_value_cstr()に変更した。結構あったのに、意外とちゃんと動いていてびっくり。

後でSketchWaltz側も直しておこう。

※ このバグは申請中のRubyPico 0.9.7 で直ります