2017-01-27 20 views
2

まず、unsigned char*タイプの記号が格納されている機能があります。たとえば、Abcdef!?の場合は、Unicodeの符号あたり2バイト、[65 0] [98 0] [99 0] [100 0] [101 0] [102 0] [33 0] [63 0]です。なぜprintfは最初の文字だけを表示しますか?

for(unsigned char i=0; i<17; i++) printf("%c", pointer[i]);を使用すると、すべてが問題なく表示され、Abcdef!?と表示されます。しかし、私がprintf("%s" pointer);を使うと、私にはAと他には何も与えません。理由を教えてください。

+6

2番目の値は0で、 'unsigned char *'配列型です: 'printf'が停止します。あなたは私たちに[mcve]を教えてもらえますか? –

+6

これらの '0'バイトをすべて表示しますか? '%s'はc-stringを出力するためのもので、nullで終了します。 * Null Terminated Byte String *と呼ばれます。したがって、最初の '0'バイトの前の最初の文字だけを取得し、それ以上読み取ろうとするのを止めます。 – BoBTFish

+3

「Unicodeシステム」と言うと、UTF-16などの意味ですか? Unicode自体はエンコーディングではなく、数字と文字のマッピングに過ぎません。 –

答えて

5

printf("%s", pointer)は文字通り意味するので:印刷'\0'に遭遇するまで、すべてのcharpointerに格納されている1つで始まるを。

'A'の直後に'\0'があるため、最初の文字のみが印刷されます。

+1

正しい書式指定子は '%ls'ですか? –

+3

@FiddlingBits:多分。これはWindows上で動作します( 'wchar_t'はUTF-16を格納します)。これは、UCS4を格納する4バイトの 'wchar_t'(これはUCS4ではありません)が多いLinuxプラットフォームでは機能しません。 –

+3

@FiddlingBits:いいえ、 '%ls'は' char'へのポインタではなく 'wchar_t'へのポインタをとります。 'wchar_t'が16ビットリトルエンディアン(壊れたMSVC定義、Unicodeとの互換性がなくても)であっても' char'配列に 'wchar_t'としてアクセスするためのエイリアス違反です。 –

関連する問題