Как бросить неподписанный символ? - PullRequest
14 голосов
/ 12 января 2010

Это не работает:

unsigned char foo;
foo = 0x123;

sprintf("the unsigned value is:%c",foo);

Я получаю эту ошибку:

не может преобразовать параметр 2 из 'unsigned char' to 'char'

Ответы [ 5 ]

35 голосов
/ 12 января 2010

Прежде чем вы начнете смотреть на неподписанные символы, вызывающие проблему, присмотритесь к этой строке:

sprintf("the unsigned value is:%c",foo);

Первым аргументом sprintf всегда является строка, в которую будет напечатано значение. Эта строка должна выглядеть примерно так:

sprintf(str, "the unsigned value is:%c",foo);

Если вы не имели в виду printf вместо sprintf.

После исправления этого вы можете использовать% u в строке формата для вывода значения типа без знака.

18 голосов
/ 12 января 2010

Использовать printf() строки формы %u:

printf("%u", 'c');
6 голосов
/ 12 января 2010

EDIT

snprintf немного безопаснее. Разработчик должен убедиться, что используется правильный размер буфера.

Попробуйте это:

char p[255]; // example
unsigned char *foo;
...
foo[0] = 0x123;
...
snprintf(p, sizeof(p), " 0x%X ", (unsigned char)foo[0]);
3 голосов
/ 12 января 2010

Я думаю, что вы перепутали с тем, как sprintf работает. Первый параметр - это строковый буфер, второй - строка форматирования, а затем переменные, которые вы хотите вывести.

1 голос
/ 12 января 2010

Вы не должны использовать sprintf, так как это может легко вызвать переполнение буфера.

Вы должны предпочесть snprintf (или _snprintf при программировании со стандартной библиотекой C Microsoft). Если вы поместили буфер в стек в локальной функции, вы можете сделать:

char buffer[SIZE];
snprintf(buffer, sizeof(buffer), "...fmt string...", parameters);

Данные могут быть усечены, но это определенно предпочтительнее переполнения буфера.

...