2017-01-27 3 views
2

Прежде всего, у меня есть функция, где у меня есть знаки, хранящиеся в unsigned char* типа. Например, для Abcdef!? это [65 0] [98 0] [99 0] [100 0] [101 0] [102 0] [33 0] [63 0] 2 байта за знак в Юникоде.Почему printf отображает только первую букву?

Когда я использую for(unsigned char i=0; i<17; i++) printf("%c", pointer[i]);, все в порядке, оно показывает Abcdef!?. Но когда я использую printf("%s" pointer);, он дает мне только A и ничего больше. Не могли бы вы рассказать мне, почему?

+6

второе значение равно 0, это массив 'unsigned char *': 'printf' останавливается. Можете ли вы показать нам [mcve], пожалуйста? –

+6

Посмотреть все эти '0' байты? '% s' предназначен для печати c-строки, которая заканчивается нулем; он правильно называется * Null Terminated Byte String *. Таким образом, вы получаете только первый символ перед первым байтом '0', а затем перестаете читать. – BoBTFish

+3

Когда вы говорите «система Unicode», вы имеете в виду UTF-16 или что-то подобное, не так ли? Сам Unicode не является кодировкой, а просто отображает символы в числа. –

ответ

5

Поскольку printf("%s", pointer) буквально означает: печати каждый char начиная с одной сохраненной в pointer до '\0' не встречается.

Существует '\0' сразу после 'A', поэтому печатается только первый символ.

+1

Правильный спецификатор формата - '% ls', no? –

+3

@FiddlingBits: Может быть. Это будет работать в Windows (где 'wchar_t' хранит UTF-16). Он не будет работать на платформах Linux, которые имеют тенденцию к четырем байтам 'wchar_t', хранящим UCS4 (и это не UCS4). –

+3

@FiddlingBits: Нет. '% Ls' принимает указатель на' wchar_t' не указатель на 'char'. Даже если 'wchar_t' является 16-битным маленьким endian (сломанным определением MSVC, несовместимым с Unicode), это нарушение псевдонимов для доступа к массиву' char' как 'wchar_t' и может также привести к сбою требования выравнивания. –

Смежные вопросы