Проблемы приведения на C / C ++, неподписанный символ на символ - PullRequest
0 голосов
/ 25 февраля 2011

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

   unsigned char y = sample.result;  
   char x = (char)y;  
   printf("%c \n", x);  

Однако printf не печатает x, но если я использую cout, x печатает правильно. Я понятия не имею, почему так. Как преобразовать переменную без знака в символ? Я делаю это неправильно? reinterpret_casting только для указателя, а мой не указатели. Заранее спасибо.

РЕДАКТИРОВАТЬ: командная строка возвращает мне смайлик "☺" для значения sample.result, которое соответствует unsigned char 1. И, очевидно, netbeans не может напечатать это смайлик. Я понятия не имею, как это перешло в смайлик. Любая помощь?

РЕДАКТИРОВАТЬ 2: Я только что понял, что вы не можете напечатать char x = 1; в NetBeans, и печать его в командной строке дает смайлик. Причины? : (

Ответы [ 5 ]

0 голосов
/ 25 августа 2013

Здесь приведено уравнение преобразования

алгоритм для char c в без знака char uc.

return (c>127) ? (unsigned char)(-(256 + c)) : (unsigned char)c;

алгоритм для без знака uc в char c.

return (uc < 0) ? (char)(256-(char)abs(uc)) : (char)uc;
0 голосов
/ 25 февраля 2011

Если char x = 1 и вы хотите распечатать 1, вам нужно использовать %d вместо %c в вашем спецификаторе формата.%c печатает ASCII-представление числа, которое для 1 является непечатаемым символом, называемым «начало заголовка».

0 голосов
/ 25 февраля 2011

Я не уверен в этом ответе, но я только что написал простую тестовую программу, которая компилирует и печатает букву A без приведения неподписанного символа обратно к символу.

#include <stdio.h>
int main()
{
  unsigned char c = 'A';
  printf("%c\n",c);
  return 0;
}

Приведение напрямую также работало:

#include <stdio.h>
int main()
{
  unsigned char c = 'A';
  printf("%c\n",(char)c);
  return 0;
}

Делать так, как вы тоже работали ...

#include <stdio.h>
int main()
{
  unsigned char c = 'A';
  char d = (char)c;
  printf("%c\n",d);
  return 0;
}

Итак, я полагаю, что я делаю что-то не так, сейчас.Или, может быть, что-то еще является вашей проблемой?

0 голосов
/ 25 февраля 2011

Преобразование %c для printf предназначено только для символов в основном наборе символов. Кажется, у вас есть расширенный символ, который вы хотите напечатать, поэтому вам придется использовать соответствующий инструмент для этого. Тип для этого будет wchar_t и формат печати %lc. Но будьте осторожны, это зависит от вашей среды исполнения, locale настроек и тому подобного.

И, кстати, во многих случаях узкие типы, такие как char, просто конвертируются в int или unsigned, поэтому нет необходимости приводить их в соответствие, и на самом деле, кроме вашего названия, ваша проблема не имеет большого значения с кастингом.

0 голосов
/ 25 февраля 2011

Попробуйте сделать x int вместо char и посмотрите, работает ли это. Правила C требуют, чтобы все параметры char были преобразованы в int, а printf - это функция C.

...