问题现象
嵌入式开发平台,交叉编译链比较老,还不支持 C++11 的 to_string 写法,此时想通过模板方式,构造一个通用的 toString 接口,采用了 ostringstream ,就出现了问题。
模板接口如下
template <typename T>
std::string CustomToString(const T& value)
{std::ostringstream oss;oss << value;return oss.str();
}
我用此接口,转换了一个 char 的数字为字符串,示例代码如下
#include <iostream>
#include <string>
#include <sstream>int main()
{char character = 1; // 10 64 1// 打印十进制数字printf("character(%%d) = %d\n", character);// 打印字符printf("character(%%c) = %c\n", character);// 转换为字符串测试std::ostringstream oss;oss << character;printf("character(%%s) = %s\n", oss.str().c_str());return 0;
}
运行结果如下
/*
zhaochen@zhaochendeAir to_string_test % ./a.out
character(%d) = 10
character(%c) = character(%s) = zhaochen@zhaochendeAir to_string_test % clang++ toStringTestV1.cpp
zhaochen@zhaochendeAir to_string_test % ./a.out
character(%d) = 64
character(%c) = @
character(%s) = @
zhaochen@zhaochendeAir to_string_test %
zhaochen@zhaochendeAir to_string_test %
zhaochen@zhaochendeAir to_string_test % clang++ toStringTestV1.cpp
zhaochen@zhaochendeAir to_string_test % ./a.out
character(%d) = 1
character(%c) =
character(%s) =
zhaochen@zhaochendeAir to_string_test %
*/
可以看到,最后一个 char 转字符串后,%s 打印出来的已经不是原始数字了。
问题点
char 类型,属于字符类型,并非数字类型,但目前很多地方用 char 类型来存储数字变量,此时如果要用来转换为字符串的话,就会存在问题,转换后的,并非想要的数字,而是变成了数字对应的 ASCII 码字符了。
此时我又继续使用转换为 ASCII 码的字符,作为数字来用,导致结果不可控,进而导致后续的异常。
总结
-
如果可以使用标准库的 to_string ,优先使用标准库。
-
如果无法使用系统自带的接口,自己使用时需要多加注意。
练习代码可以参考仓库:to_string_test