3

次のコードの場合、私の PC では、char\0は常にスペースになります (を使用して印刷する場合cout)。ただし、友人の PC では、 char の結果\0は常にchar になりaます。コードとスクリーンショットは次のとおりです。

#include <iostream>
using namespace std;

// Function main
int main()
{
    cout << "xxx" << '\0' << "yyy" << endl;
    return 0;
}

ここに画像の説明を入力 ここに画像の説明を入力

:私のPC上。 : 友人の PC で。

何が起きてる?PC によって結果が異なるのはなぜですか?

PS :

  1. 同じ実行可能ファイルを共有しても、結果は異なりexeます (つまり、自分の PC でコンパイルし、両方の PC で実行します)。

  2. 両方とも、同じプロジェクト キャラクター セットでビジュアル スタジオ 2010 を使用しています。

  3. ここでバッファ オーバーランが発生する可能性がありますが、友人が常にcharを取得する間、常にa を取得するという事実に注意してください。spacea

  4. 私たち二人がそうするなら、それは同じ機能を共有しますcout<<ends

4

5 に答える 5

2

「印刷できない文字」 (ASCII では 0x20 ~ 0x7e [*] の範囲外のもの) の場合、出力は技術的に定義されておらず、実際の視覚的出力はいくつかの要因に依存します。

  1. 実際の出力デバイス - Windows コマンド ライン プロンプトで文字を表示すると、Linux のターミナル ウィンドウとは異なって見える可能性があり、本物の (30 年以上前の) VT100 ターミナルを使用すると、おそらくまた異なって見えるでしょう。(実際、シリアル入力を使用する端末用のコードを最初に書いたとき、特定の制御シーケンスを NUL 文字で「パディング」していました。これは、エスケープ シーケンスが「複雑」な場合に端末が一部の文字を削除するためです。 -screen、次の 5 ~ 6 文字を受信しない可能性があるため、10 個の NUL 文字を追加して、画面に表示したい意味のあるテキストの一部ではなく NUL を失うようにします)。

  2. 該当する場合は、テキストを表示するために選択されたフォントも重要になる場合があります (これは、この特定の状況に当てはまるように見えますが、それに依存しないでください)。もちろん、これは印刷可能な文字にも当てはまりますが、いくつかの「特別な」フォント (Zapf Dingbats、Symbols は明らかな例です) を除いて、「印刷可能な範囲」は私たちが期待するものと一致します。「印刷不可」の範囲はあまり明確に定義されていません。

  3. 実際の印刷方法 - たとえば、coutorprintfを使用すると、「PC のフレーム バッファ メモリに [テキスト モードで] 文字を突っ込む」場合とは異なる結果になります。

印刷不可能な文字を一貫して印刷するには、それらを印刷可能として定義されたものに処理する必要があります。

[*] 多くのシステムが拡張範囲をサポートしています。たとえば、元の IBM/PC の範囲は 0x20 ~ 0xff であり、最近のシステムでは複数のバイトを使用して、UTF-8 エンコーディングなどで「印刷できない」文字を表します。 [ヨーロッパ言語で] 使用される文字は 1 バイトでエンコードされ、あまり一般的でない文字は 2、3、または 4 バイトのエンコードになります。ここでも、実際の出力は、選択した正確なフォントによって異なります。

于 2014-01-01T12:07:54.650 に答える
1

述べたように、それは実装定義です。私の端末では、^@. NULLターミネータは文字列の出力に使用されますが、この場合、文字自体を出力しようとしています (ランダムな文字から何もないものまで、さまざまな表現があります) 。

于 2014-01-01T09:17:09.637 に答える
0
#include < iostream >
using namespace std;
int main()
{
    cout << "xxx" << '\0' << "yyy" << endl;
    return 0;
}

なぜ異なる o/p を取得しているのかわかりません。g++で一度確認してください。私はg ++でこのo/pを手に入れました

ここに画像の説明を入力

于 2014-01-01T09:15:12.003 に答える