将字符打印为整数

时间:2012-06-08 14:05:25

标签: c++ formatting ostream interpretation

我想控制ostream输出charunsigned char通过<<将它们写为字符整数。我在标准库中找不到这样的选项。现在我已经恢复使用一组替代打印功能的多次重载

ostream& show(ostream& os, char s) { return os << static_cast<int>(s); }
ostream& show(ostream& os, unsigned char s) { return os << static_cast<int>(s); }

有更好的方法吗?

4 个答案:

答案 0 :(得分:1)

不,没有更好的方法。更好的方法是采用自定义流操纵器的形式,如std::hex。然后,您可以关闭和打开整数打印,而无需为每个数字指定它。但是自定义操纵器在流本身上运行,并且没有任何format flags可以执行您想要的操作。我想你可以编写自己的流,但这比你现在做的更多。

老实说,最好的办法是看看你的文本编辑器是否具有使static_cast<int>更容易输入的功能。我假设你要打字很多,否则你不会问。这样,读取您的代码的人确切地知道您的意思(即,将char打印为整数),而无需查找自定义函数的定义。

答案 1 :(得分:1)

只是对旧帖子的更新。实际的诀窍是使用&#39; +&#39;。例如:

template <typename T>
void my_super_function(T x)
{
  // ...
  std::cout << +x << '\n';  // promotes x to a type printable as a number, regardless of type
  // ...
}

在C ++ 11中你可以这样做:

template <typename T>
auto promote_to_printable_integer_type(T i) -> decltype(+i)
{
  return +i;
}

信用:How can I print a char as a number? How can I print a char* so the output shows the pointer’s numeric value?

答案 2 :(得分:0)

我有一个基于how do I print an unsigned char as hex in c++ using ostream?中使用的技术的建议。

template <typename Char>
struct Formatter
  {
  Char c;
  Formatter(Char _c) : c(_c) { }

  bool PrintAsNumber() const
    {
    // implement your condition here
    }
  };

template <typename Char> 
std::ostream& operator<<(std::ostream& o, const Formatter<Char>& _fmt)
  {
  if (_fmt.PrintAsNumber())
    return (o << static_cast<int>(_fmt.c));
  else
    return (o << _fmt.c);
  }

template <typename Char> 
Formatter<Char> fmt(Char _c)
  {
  return Formatter<Char>(_c);
  }

void Test()
  {
  char a = 66;
  std::cout << fmt(a) << std::endl;
  }

答案 3 :(得分:0)

在C ++ 20中,您将可以使用std::format来做到这一点:

unsigned char uc = 42;
std::cout << std::format("{:d}", uc); // format uc as integer 42 (the default)
std::cout << std::format("{:c}", uc); // format uc as char '*' (assuming ASCII)

在此期间,您可以使用the {fmt} librarystd::format是基于。

免责声明:我是{fmt}和C ++ 20 std::format的作者。