如何在C ++中将数字转换为string,反之亦然

由于这个问题每周都会被问到,这个FAQ可能会帮助很多用户。

  • 如何将整数转换为C ++中的string

  • 如何将string转换为C ++中的整数

  • 如何将浮点数转换为C ++中的string

  • 如何将string转换为C ++中的浮点数

更新C ++ 11

C++11标准开始,string到数字的转换,反之亦然。 以下所有函数都存在于<string> (按照第21.5节)。

string到数字

 float stof(const string& str, size_t *idx = 0); double stod(const string& str, size_t *idx = 0); long double stold(const string& str, size_t *idx = 0); int stoi(const string& str, size_t *idx = 0, int base = 10); long stol(const string& str, size_t *idx = 0, int base = 10); unsigned long stoul(const string& str, size_t *idx = 0, int base = 10); long long stoll(const string& str, size_t *idx = 0, int base = 10); unsigned long long stoull(const string& str, size_t *idx = 0, int base = 10); 

每一个都将一个string作为input,并尝试将其转换为数字。 如果不能构造有效的数字,例如因为没有数字数据,或者数字超出范围,则抛出exception( std::invalid_argumentstd::out_of_range )。

如果转换成功并且idx不为0 ,则idx将包含未用于解码的第一个字符的索引。 这可能是最后一个字符后面的索引。

最后,整数types允许指定一个基数,对于大于9的数字,假设字母表( a=10直到z=35 )。 你可以在这里find更多关于浮点数 ,有符号整数和无符号整数的格式的信息。

最后,对于每个函数,还有一个接受std::wstring的重载,因为它是第一个参数。

数字到string

 string to_string(int val); string to_string(unsigned val); string to_string(long val); string to_string(unsigned long val); string to_string(long long val); string to_string(unsigned long long val); string to_string(float val); string to_string(double val); string to_string(long double val); 

这些更直接,你传递适当的数字types,你会得到一个string。 对于格式化选项,您应该返回到C ++ 03stringstream选项并使用stream操作符,如其他答案中所述。

如注释中所述,这些函数回退到默认的尾数精度,可能不是最大的精度。 如果您的应用程序需要更高的精度,最好回到其他string格式化过程。

还有类似的函数被定义为to_wstring ,这些函数将返回一个std::wstring

如何将数字转换为C ++ 03中的string

  1. 不要使用 itoaitof函数,因为它们是非标准的,因此不能移植。
  2. 使用stringstream

      #include <sstream> //include this to use string streams #include <string> int main() { int number = 1234; std::ostringstream ostr; //output string stream ostr << number; //use the string stream just like cout, //except the stream prints not to stdout but to a string. std::string theNumberString = ostr.str(); //the str() function of the stream //returns the string. //now theNumberString is "1234" } 

    请注意,您也可以使用stringstream来将浮点数字转换为string,并且可以根据需要对string进行格式化,就像使用cout

     std::ostringstream ostr; float f = 1.2; int i = 3; ostr << f << " + " i << " = " << f + i; std::string s = ostr.str(); //now s is "1.2 + 3 = 4.2" 

    您可以使用stream操纵std::setprecision() ,如std::endlstd::hex和函数std::setw()std::setprecision()等与stringstream完全相同的方式与cout

    不要将 std::ostringstreamstd::ostrstream 。 后者已被弃用

  3. 使用boost词法强制转换 。 如果您不熟悉boost,最好从像lexical_cast这样的小型库开始。 要下载并安装boost及其文档, 请点击这里 。 尽pipeboost并不是C ++标准,但很多boost的库最终得到了标准化,boost被广泛认为是最好的C ++库。

    词法转换使用下面的stream,所以基本上这个选项和前一个一样,只是不那么冗长。

     #include <boost/lexical_cast.hpp> #include <string> int main() { float f = 1.2; int i = 42; std::string sf = boost::lexical_cast<std::string>(f); //sf is "1.2" std::string si = boost::lexical_cast<std::string>(i); //sf is "42" } 

如何将string转换为C ++中的数字03

  1. 从Cinheritance的最轻量级选项是函数atoi (用于整数(按字母到整数))和atof (用于浮点值(按字母顺序排列))。 这些函数将一个C风格的string作为参数( const char * ),因此它们的用法可能被认为不是一个很好的C ++实践。 cplusplus.com在atoi和atof上都有简单易懂的文档,包括在input错误的情况下如何行事。 但是,如果input数字太大而不能适应目标types,则链接中会包含一个错误,该行为是不确定的。

     #include <cstdlib> //the standard C library header #include <string> int main() { std::string si = "12"; std::string sf = "1.2"; int i = atoi(si.c_str()); //the c_str() function "converts" double f = atof(sf.c_str()); //std::string to const char* } 
  2. 使用stringstream(这次是inputstringstream, istringstream )。 同样,istringstream就像cin一样使用。 再次,不要将istringstreamistrstream混淆。 后者已被弃用。

     #include <sstream> #include <string> int main() { std::string inputString = "1234 12.3 44"; std::istringstream istr(inputString); int i1, i2; float f; istr >> i1 >> f >> i2; //i1 is 1234, f is 12.3, i2 is 44 } 
  3. 使用boost词法强制转换 。

     #include <boost/lexical_cast.hpp> #include <string> int main() { std::string sf = "42.2"; std::string si = "42"; float f = boost::lexical_cast<float>(sf); //f is 42.2 int i = boost::lexical_cast<int>(si); //i is 42 } 

    在input错误的情况下, lexical_cast抛出boost::bad_lexical_casttypes的exception

我从StackOverflow的某个地方偷了这个convienent类来将任何stream式转换为string:

 // make_string class make_string { public: template <typename T> make_string& operator<<( T const & val ) { buffer_ << val; return *this; } operator std::string() const { return buffer_.str(); } private: std::ostringstream buffer_; }; 

然后你用它作为;

 string str = make_string() << 6 << 8 << "hello"; 

非常漂亮!

另外,我使用这个函数来将string转换为任何可以stream式传输的东西,如果你试图parsing一个不包含数字的string,它也不是很安全。 (也不像最后一个那么聪明)

 // parse_string template <typename RETURN_TYPE, typename STRING_TYPE> RETURN_TYPE parse_string(const STRING_TYPE& str) { std::stringstream buf; buf << str; RETURN_TYPE val; buf >> val; return val; } 

用于:

 int x = parse_string<int>("78"); 

你可能也想要wstrings的版本。