2

私はいつもC++/Cのnullで終了する文字列について質問がありました。たとえば、次のような文字配列がある場合:

char a[10];

そして、あなたはそのような文字で読みたいと思いました:

for(int i = 0; i < 10; i++)
{
  cin >> a[i]; 
}

そして、次の単語を入力しましょう:質問者

入力として。

さて、私の質問は「\0」はどうなるのかということです。文字列を逆にして印刷する場合

renoitseuq

ヌル終了文字はどこに行きますか?プログラミングの良い習慣は、ゼロで終わる文字のために常に1文字余分に残すことだと思いました。しかし、この例では、すべてが正しく印刷されたので、なぜnull終了文字を気にするのでしょうか。ちょっと興味があるんだけど。あなたの考えをありがとう!

4

3 に答える 3

3

ヌルターミネータが与えられる場合と、自分でヌルターミネータを要求する必要がある場合があります。

const char* x = "bla";

nullで終了するCスタイルの文字列です。実際には4文字です-3+nullターミネータ。

文字列はnullで終了していません。実際、これをnullで終了する文字列として扱うと、未定義の動作が発生します。それに行った場合cout <<、ランタイムはnullターミネータを探し続け、1に達するまで文字を吐き出すため、アクセスが許可されているメモリを超えて読み取ろうとします。あなたの場合、最後に1つあったのは幸運でしたが、それは保証ではありません。

char a[10];他の配列とまったく同じです-初期化されていない値、10文字-char配列であるという理由だけで11ではありません。int b[10]遊ぶための10個の値と、最後に余分な値が含まれているとは思わ0ないでしょう。

さて、それを読み返してみると、C文字列からもそれを期待する理由がわかりません-すべてが直感的ではありません。

于 2013-02-09T20:07:18.817 に答える
0

文字列ではなく、10文字を読んでいます。10文字も逆に出力すると仮定します。したがって、0文字は何の役割も果たしません。配列を文字列としてではなく、単一文字の配列として使用します。

于 2013-02-09T20:08:07.247 に答える
0

char a[10]は10文字で、いずれも。にすることができます'\0'。あなたが"questioner"そこに入れるならば、それらのどれもありません。それを取得するには、必要なa[11]ものを「質問者」で埋めてから'\0'

それを逆にした場合は'\0'、a [?]の最初の位置を取得し、それまで逆にしてから、ヌルターミネータを追加します。

これはCの古典的なバナナの皮ですが、残念ながら、慣れすぎていても、最も不適当な瞬間に足を踏み入れることができます。

于 2013-02-09T20:27:00.243 に答える