LoginSignup
5
9

More than 5 years have passed since last update.

C言語で文字列操作するのに便利な「utstring」

Posted at

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);
}
5
9
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
9