Использование fputc () для записи одного байта - PullRequest
1 голос
/ 22 августа 2011

Учитывая unsigned char *str, строку в кодировке UTF-8, допустимо ли писать первый байт (не символ) с fputc((char)(*str), file);

Ответы [ 4 ]

2 голосов
/ 22 августа 2011

Убрать приведение к char.fputc принимает символ для записи в качестве аргумента int, значение которого должно находиться в диапазоне unsigned char, а не char.Предполагая, что (unsigned char)(char) действует как оператор идентификации для значений unsigned char, в вашем коде нет ошибок, но это не гарантируется, особенно для систем с нестандартным кодированием без дополнения двойками.

1 голос
/ 22 августа 2011

Это законно. fputc преобразует свой вход int в unsigned char, и это преобразование не может сделать ничего слишком неприятного. Это просто принимает значение по модулю UCHAR_MAX+1.

Если char не подписано в вашей реализации, то преобразование из unsigned char в char не влияет на значение.

Если в вашей реализации подписано char, то преобразование значения, большего CHAR_MAX, в char либо даст результат, определенный реализацией, либо вызовет сигнал (6.3.1.3/3). Таким образом, хотя ваш код допустим, возможное поведение включает в себя выдачу сигнала, который завершает программу, что может не соответствовать вашему желанию.

На практике вы ожидаете, что реализации будут использовать дополнение 2 и конвертировать в знаковые типы «очевидным» способом, сохраняя битовый шаблон.

Даже если ничего не выйдет из строя, ваш терминал может не сделать ничего разумного, если вы напишите странный байт в STDOUT.

0 голосов
/ 22 августа 2011

Да, это законно.fputc просто напишет байт.Приведение к подписанному / неподписанному в этом случае просто остановит стон компилятора.

0 голосов
/ 22 августа 2011

Нет, вы должны передать указатель FILE в качестве второго параметра. Это дескриптор файла, в который вы хотите записать символ, например stdout.

fputc(*str, stdout);
...