C言語で文字列操作するのにいちいち動的にメモリ確保したりするの面倒だなあというときには、「utstring」を使うと便利かもしれません。
utstringとは
utstringは、C言語で動的に文字列操作するためのライブラリです。大部分がマクロで実装されているのが特徴で、utstring.hをincludeするだけで使えるので非常にお手軽。
下記サイトから入手できます。
https://troydhanson.github.io/uthash/utstring.html
以下は公式サイトでも説明されている内容なので、正確な情報は公式サイトを参照してください。また、utstring.hは単なるマクロ定義の塊なので、細かい挙動はソースコードからも確認できます。
使い方
utstring.hをダウンロードして、includeするだけで使えます。
#include "utstring.h"
文字列型としてUT_stringという構造体が定義されているので、通常のchar*の代わりにこれを使います。
UT_stringの構造体定義は次のようになっています。dが内部文字列の領域へのポインタで、nが確保された領域のサイズ、iが未使用領域へのインデックスとのことです。
typedef struct {
char *d; /* pointer to allocated buffer */
size_t n; /* allocated capacity */
size_t i; /* index of first unused byte */
} UT_string;
UT_stringを使って文字列操作するためのさまざまなオペレーションがutstring_xxxxという名前で用意されているので、これを使えば、string.hでできるような一連の操作を行えます。
具体的には、次のようなオペレーションが用意されています。
- utstring_new(s) : 新規utstringを作成する
- utstring_free(s) : sの領域を解放する
- utstring_init(s) : sを初期化する
- utstring_done(s) : sの文字列領域を解放する
- utstring_renew(s) : sがNULLの場合は、新規に領域を確保する。NULLでない場合はクリアする(utstring_clearと同等)
- utstring_printf(s,fmt,…) : sに文字列をセットする
- utstring_bincpy(s,bin,len) : char*の文字列をsにコピー(追加)する
- utstring_concat(dst,src) : utstring同士を連結する
- utstring_clear(s) : sをクリアする(空文字列にする)
- utstring_len(s) : sの文字列長を返す
- utstring_body(s) : sの文字列をchar*として返す
- utstring_find(s,pos,str,len) : s内の部分文字列をposの位置から後ろ方向に検索する
- utstring_findR(s,pos,str,len) : s内の部分文字列をposの位置から前方向に検索する
utstring_new(s)/utstring_free(s)とutstring_init(s)/utstring_done(s)の違い
utstring_new(s)はutstring_free(s)はsそのもののメモリ領域を確保/解放します。utstring_init(s)/utstring_done(s)は内部文字列の領域の初期化と解放を行います。
なお、utstring_clear(s)は内部文字列としてヌル文字をセットしてサイズを0にするだけで、メモリは解放しません。
使用例
#include <stdio.h>
#include "utstring.h"
int main() {
UT_string *s;
utstring_new(s); // 新規作成
utstring_printf(s, "number=%d", 123); // 文字列を格納
printf("%s\n", utstring_body(s)); // 出力 number=123
UT_string *t;
char *str = "hoge";
utstring_new(t);
utstring_bincpy(t, str, strlen(str)); // char*から文字列をコピー
printf("%s\n", utstring_body(t)); // 出力 hoge
utstring_concat(s, t); // tをsに連結
printf("%s\n", utstring_body(s)); // 出力 number=123hoge
utstring_free(s); // 解放
utstring_free(t);
}