一部の人々は、連続した文字列(C文字列)ではなく、 「ロープ」データ構造を使用して、無制限の長さの文字列を格納することを好みます。
簡略化されたロープは、次のように定義できます。
#include <stdio.h>
struct non_leaf_rope_node{
char zero;
union rope* left_substring;
union rope* right_substring;
// real rope implementations have a few more items here
};
#define rope_leaf_max ( sizeof( struct non_leaf_rope_node ) )
typedef union rope {
char rope_data[ rope_leaf_max ];
struct non_leaf_rope_node pointers;
} rope;
void print( union rope *node ){
if( node->rope_data[0] != '\0' ){
// short literal data
fputs( node->rope_data, stdout );
}else{
// non-root node
print( node->pointers.left_substring );
print( node->pointers.right_substring );
};
};
// other details involving malloc() and free() go here
int main(void){
rope left = { "Hello," };
rope right = { " World!" };
rope root = {0,0,0};
root.pointers.left_substring = &left;
root.pointers.right_substring = &right;
print( &root );
return 0;
};
lope_leaf_max文字未満のロープは、nullで終了するC文字列と同じように格納されます。左と右のサブ文字列を指すルートnon_leaf_rope_nodeとして、rope_leaf_max文字を超えるロープが格納されます(これは、左と右のサブサブ文字列を指す場合があります)。最終的には、リーフノードとリーフノードを指します。それぞれに、完全な文字列の少なくとも1つの文字が含まれています。
ロープは常に少なくとも1つの文字を格納するため、常に次のことがわかります。ロープノードの最初のバイトがゼロ以外の場合、そのノードはリテラル文字を格納するリーフノードです。ロープノードの最初のバイトがゼロの場合、そのノードは左右のサブ文字列へのポインタを格納します。(実際のロープの実装には、多くの場合、第3の種類のロープノードがあります)。
多くの場合、ロープを使用すると、C文字列を使用するよりも必要なRAMスペースの合計が少なくなります。(「ニューヨーク市」などのフレーズを含むノードは、1つのロープで、または2つのロープ間で共有される一部の実装で複数回再利用できます)。ロープを使用する方が、Cストリングを使用するよりも速い場合があります。