私は、代わりにStringクラスのC++で使用した場合であっても、それCスタイルの文字列を理解し、ヌル終端文字必要として:それはnull文字の欠如がプログラムを引き起こすことも私の理解であるヌルターミネータがないにもかかわらず、charへのC++ポインタが文字列として機能するのはなぜですか?
This is a string.\0
を文字列の後のメモリにあるものを読み続けるために、ヌル文字のバイナリ表現が見つかるまで続けます。これは非常に明確に未定義の動作です。
私がやっている別の練習プロジェクトの一部として実践のためにこれを書いたかった - これを行うためのライブラリ施設があることは分かっていますが、 invalid_argument
例外の文字列を作成します)。 null文字として
int dtoi(const char d){
switch(d){ //using switch statement rather than d-'0' to support character sets with non-consecutive digits or digits that go from 9 to 0 rather than 0 to 9
case '0':
return 0;
case '1':
return 1;
case '2':
return 2;
case '3':
return 3;
case '4':
return 4;
case '5':
return 5;
case '6':
return 6;
case '7':
return 7;
case '8':
return 8;
case '9':
return 9;
default:
throw invalid_argument(((d == '\0') ? "null character" : &d) + string(" is not a valid digit character."));
}
}
例外文字列の先頭に、それは最初の文字で終了させ(すなわち。ヌル文字がdtoiの私の実装に渡されたとき)、私はそれがテキストを表示することにしました'\0'
の場合は、文字を直接挿入するのではなく、「ヌル文字」を使用します。これを実装するには、条件演算子を使用します。その後、条件演算子は、リテラル文字列の最初の文字または直接文字へのポインタのいずれかを返すことがあるので、私は(d == '\0') ? "null character" : d
(それが最後でd
ない&d
を言う方法を告知)を使用することはできません。何が起こったのかを見るために、私は&d
を試してみることにしました。私の驚いたことに、exception.what()の関数に渡された文字は何でも印刷されました。私はそれが渡された文字へのポインタを提供することを期待しますが、null文字が見つかるまでランダムなメモリに読み込み続けます。私は、複数の異なる文字を渡してこれを複数回試しました。なぜそれがそのまま動作しますか?私はそれが未定義の振る舞いであることについて実際には正しいのですか?ここで意図したとおりに動作するのでしょうか?
:あなたは全体の厄介スイッチと
?:
オペレータの代わりにやるべきことはこれです。 – juanchopanzadownvotingしている人には:なぜあなたはこれをやっているのかわかりません - それは有効な質問のようです。特定のアクションが実際に未定義のビヘイビアかどうか、あるいはC++の仕組みを誤解しているかどうかを尋ねています。これがどういう形であれ無効であれば、下線を与えるのではなく教えてください。 – john01dav
@juanchopanzaそれは非常に答えのように聞こえる。 – john01dav