4

下面从字符转换为字符串的正确结果是什么?

我听说旧的 bo​​ost 版本1.46 lexical_cast 输出是56,我附近没有那个版本,我无法测试它。但 boost library(1.49) 输出为:8

  unsigned char c= 56;
  std::string s = boost::lexical_cast<std::string>(c);
  std::cout << "boost::lexical_cast: " << s << std::endl;

C++11 to_string 输出为:56

  std::cout << "std::to_string: " << std::to_string(c) << std::endl;
4

5 回答 5

8

std::to_string只为数字类型提供重载,在这种情况下可能解析为unsigned版本。lexical_cast, OTOH, 依赖于std::ostream::operator<<执行转换,因此被c视为一个字符。

于 2013-06-05T10:23:55.913 回答
5

两者都是正确的。to_string不在乎它c的类型char,它会读取其中的数字并将其转换为字符串。

另一方面,lexical_cast<std::string>似乎将类型变量解释char为 ascii 值。56 是 8 的 ascii 值。

于 2013-06-05T10:23:30.610 回答
3

旧的 bo​​ost 版本不正确。

的结果lexical_cast应该与流式传输到 ostream 相同。所以结果

std::cout << boost::lexical_cast<std::string>(x)

等同于

std::cout << x

如果unsigned char这意味着将 x 解释为 ASCII 码,对于其他整数类型,它将给出与itoa. 这是因为charostream 不将这些类型视为算术整数(参见 §27.3.6.2 与 §27.3.6.4)。这种方法的优点是您可以通过输出单个字符来输出字符串。如果您想要实际的数值,您始终可以将 char 转换为算术类型以进行输出。

to_string另一方面itoa,对于所有整数数据类型都适用,因为它没有unsigned char. 这里的基本原理是,通过调用to_string您已经表达了您执行转换的意图,即您对值的字符类型质量(这将是默认值)不感兴趣,而是对算术类型质量感兴趣。

于 2013-06-05T10:26:35.010 回答
2

这是解释的问题。如果将 a 解释char为一个小整数,则以当前字符集打印其代码;这to_string似乎是在做的事情。

如果您将其解释为要打印的字符,则发出相应的字符,即8按原样进行boost::lexical_cast

于 2013-06-05T10:24:59.327 回答
1

这不是字符到字符串,而是“无符号字符”到字符串。他们都是正确的。lexical_cast 使用 stringstream 实例进行转换,而 std::to_string 为 unsigned 重载,这意味着 unsigned char 被提升为 unsigned int。

于 2013-06-05T10:25:29.150 回答