g_strdup_printf

GLib には g_strdup_printf という関数があることを今頃知った。
strdup にに文字列成形機能を追加したということみたい。
ライブラリ関数として用意されているのだから利用しない手はない。

_strdup、_wcsdup、_mbsdup

strdup は _strdup とう名前で VisualStudio でも使えるようだ。
malloc して内容をコピーするだけなのでアッサリ自作できるとはいえ。

更に devhelp をよく見ると文字列は GPtrArray で配列にしている。
GArray で文字列でも問題ないみたいだけど。
とにかく前回のコードを上記で書き換えてみる。

#include <glib.h>

int
main (int argc, char** argv) {

    GPtrArray* array;
    gchar*  str;
    gint    count, i;

    count = 3;
    array = g_ptr_array_new();
    i = 0;
    for (i; i<count; i++) {
        str = g_strdup_printf("GArray %03d", i);
        g_ptr_array_add(array, str);
    }
    /* printf */
    i = 0;
    for (i; i<array->len; i++) {
        g_print("%s\n", g_ptr_array_index(array, i));
    }
    /* free */
    g_ptr_array_free(array, TRUE);
    return 0;
}

g_strdup_printf ならこんなにスッキリ!
これは g_ptr_array_free が破棄してくれるけど通常は破棄を忘れずに。

GPtrArray なら一揆に簡単になった。
オブジェクト作成に引数は不要だし配列へのポインタ追加も代入不要。
中身の取り出しも型名指定する必要が無い、文字列なら絶対にコッチ。

ただ C 言語なので演算子のオーバーロードがない。
list[0] みたいにはできないんですね。