在C++编程中,我们经常遇到的一个基础问题是类型转换,比如将某个数值类型的变量(整型或者浮点型)转换成文字字符串的一部分展示给用户,这个时候我们就需要将数值类型转换成字符串。特别是这种转换十分频繁的时候,我们希望转换的方式是不容易出错且效率非常高的。在这篇文章中,我将系统地总结C++中将数值类型转换成字符串的各种方法并从效率和代码鲁棒性的方面对各个方法进行比较。

C++17 前的常用方法

在C++17之前我们主要有如下集中方式将数值类型转换为字符串:

  • sprintf / snprintf
  • stringstream
  • to_string
  • sprintf / snprintf

    std::sprintf 和std::snprintf包含在头文件<cstdio>中,函数签名如下:

    int sprintf( char* buffer, const char* format, ... );
    int snprintf( char* buffer, std::size_t buf_size, const char* format, ... );
    

    其中,buffer是指向目标字符串地址的指针,format是以“%d”开头,以“\0”结尾的C风格字符串,定义数值以何种方式输出到目标字符串中。sprintf将数值转换成“format”字符串定义格式的字符串并在末尾加上null terminator,最后写入到buffer指定的字符串存储空间中。这种方法的一个显著问题是sprintf函数本身不负责任何的内存管理,因此这种方法比较发生写越界的错误。
    为了提高写入安全性,C++11引入了snprintf,相比较sprintf,这个函数多了buf_size这个参数来指定写入buffer的字符串的最大长度:最多buf_size - 1个字符(不包含结尾的null terminator)会被写入buffer的地址空间。
    两个函数的函数返回值均为转换后除去null terminator的字符个数,对于snprintf,如果返回值小于buf_size,则buffer中只会写入部分转换后的字符串。在出错的情况下函数返回 -1。

    Example

    #include <cstdio>
    #include <string>
    #include <cinttypes>
    std::string str(15, ' ');
    uint32_t integer = 100;
    auto result_1 = sprintf(str.data(), "%d", interger);
    auto result_2 = snprintf(str.data(), str.size
    C++数字字符(串)转换一、数字字符1、数字字符2、字符数字二、数字字符串1、数字字符串2、字符串数字 一、数字字符 1、数字字符 #include <iostream> using namespace std; void transfer() int n; //要化的个位数字 cout << "输入数字:"; cin >> n; char ch; ch = n + '0'; //利用数字在ASCII中与0 是最常用和最推荐的方法,因为它简单、安全,且不涉及手动分配缓冲区。然而,根据具体的需求,选择适当的方法是很重要的。如果需要更高级的格式化或其他操作,可能需要使用其他方法。函数,可以将整数、浮点数以及其他数字类型转换字符串,如前面的示例所示。类来将数字转换字符串,这样可以更精细地控制格式。可以将数字格式化为字符串。使用C++标准库中的。 在c++编程中,我们经常会将各种数字类型转换字符串类型,如int字符串,int的十六进制转换字符串,float转换字符串,double转换字符串等;也可能反过来,将字符串转换为各种数字类型,如字符串int,字符串各种进制,字符串浮点数类型,这篇文章就是介绍如何将数字字符串字符串数字。... 格式化数字字符串   sprintf 最常见的应用之一莫过于把整数打印到字符串中,所以,spritnf 在大多数场合可以替代  itoa。  如:  //把整数123 打印成一个字符串保存在s 中。   sprintf(s, "%d", 123); //产生"123" (原文:http://baike.baidu.com/view/1295144.htm) 要实现这个目标,非stringstream类莫属。 这个类在头文件中定义, < sstream>库定义了三种类:istringstream、ostringstream和stringstream,分别用来进行流的输入、输出和输入输出操作。另外,每个类都有一个对应的宽字符集版本。 简单起见,我主要以stringstream为中心,因为每个转换都要涉及到输入和输出操作。