1

必ずしもやりたいわけではありませんが、興味があります。C/C++ では、null ターミネーター以外の文字列ターミネーターを定義する方法はありますか? 例えばこんな書き方でいいのかな?

char* str = "123456|ABCDEF";

char* foo = str;
char* bar = strstr(str, "|") + 1;

// do something here to define '|' as a terminator

std::cout << foo << std::endl;
std::cout << bar << std::endl;

// undo pipe-as-terminator definition

出力を取得し、

123456
ABCDEF

?

不可能な場合、メモリを割り当て/コピーせずに、バッファを変更せずに、つまりs をs に上書きせずに、バッファの一部へのポインタを取得する方法はありますか?|\0

4

2 に答える 2

6

部分文字列へのポインタとサイズを保持する文字列参照ラッパーを作成し、次のwrite代わりに使用できoperator<<ます。

// Sketch
struct StringRef {
    const char* start;
    std::size_t length;
    // add code to initialize the object out of the substring
};
std::ostream& operator<<(std::ostream& o, const StringRef& s) {
   return o.write(s.start,s.length);
}
于 2013-01-16T19:31:18.757 に答える
0

このルールはコンパイラ内でハードビルドされているため、できるとは思いません。実際には、アセンブリ '.asciz' ディレクティブを使用して、宣言する各文字列定数の最後にコンパイラが null-trminator を含めます。したがって、gcc のソース コードを変更しない限り、変更できないと思います。MSVC などの他のコンパイラについてはよくわかりません。Clangの場合、そうする方法があるかどうかはわかりません。調査が必要です。別の方法として、難しい方法で各文字列リテラルを const char message[] = { 'H','e','l','l','o',' ', として入力することもできます。 '!','|' };

ただし、コンパイラがこの種の制限を課す場合、それには正当な理由があることを指摘したいと思います。たとえば、ユーザーから入力テキストを取得するプログラムを想像してください。ユーザーが「|」を入力した場合 彼のテキストで?ヌル文字が選択された理由は、ユーザーがこの文字を入力できないためです (これは印刷可能な文字のセットの一部ではなく、とにかく「ヌル」キーを含むキーボードについて知らないためです) . 少なくとも、null ターミネータとして別の文字を使用する必要がありますが、簡単に入力できる文字は使用しないでください。

それ以外の場合は、人々が車輪の再発明を好むオペレーティング システム開発に興味があり、別の手法を使用しようとする人々をすでに見てきました。一定時間の strlen() 操作を提供します。また、C#/.NET 文字列は長さのプレフィックスと null で終了しますが、実際には興味がありません...

より正確に説明する前に、使用しているコンパイラと、プログラミングの「レベル」を知りたいです (理解できないことについては教えないでください) x)

乾杯、抽象

于 2013-01-16T19:44:23.243 に答える