私は C で言語インタープリターを作成しており、私のstring
型には次のlength
ような属性が含まれています。
struct String
{
char* characters;
size_t length;
};
このため、C には組み込みのサポートが含まれていないため、この種の文字列を手動で処理するインタープリターで多くの時間を費やさなければなりません。基本的な C に準拠するためだけに、単純な null で終わる文字列に切り替えることを検討しましたが、そうしない理由はたくさんあるようです。
null を探す代わりに「長さ」を使用すると、境界チェックが組み込まれます。
その長さを見つけるには、文字列全体をトラバースする必要があります。
null で終わる文字列の途中で null 文字を処理するには、余分な作業を行う必要があります。
Null で終わる文字列は、Unicode をうまく処理できません。
null で終わらない文字列は、より多くインターンすることができます。つまり、"Hello, world" と "Hello" の文字は、長さが異なるだけで同じ場所に格納できます。これは、null で終わる文字列では実行できません。
文字列スライス (注: 私の言語では文字列は不変です)。明らかに、2 番目の方が遅くなります (そして、よりエラーが発生しやすくなります。両方の関数のbegin
とにエラー チェックを追加することを検討してください)。end
struct String slice(struct String in, size_t begin, size_t end)
{
struct String out;
out.characters = in.characters + begin;
out.length = end - begin;
return out;
}
char* slice(char* in, size_t begin, size_t end)
{
char* out = malloc(end - begin + 1);
for(int i = 0; i < end - begin; i++)
out[i] = in[i + begin];
out[end - begin] = '\0';
return out;
}
結局のところ、ヌル終了文字列を使用する必要があるかどうかについては、もはや考えていません。C がヌル終了文字列を使用する理由について考えています。
だから私の質問は次のとおりです:私が見逃しているヌル終了の利点はありますか?