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

mctunoxg  于 2023-08-09  发布在  其他
关注(0)|答案(6)|浏览(98)

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

  • 如何在C++中将整数转换为字符串
  • 如何在C++中将字符串转换为整数
  • 如何在C++中将浮点数转换为字符串
  • 如何在C++中将字符串转换为浮点数
iezvtpos

iezvtpos1#

C++11更新

C++11标准中,字符串到数字的转换以及数字到字符串的转换都内置在标准库中。<string>中包含以下所有功能(根据第21.5段)。

字符串转数字

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);

字符串
每一个都以一个字符串作为输入,并试图将其转换为一个数字。如果无法构造有效的数字,例如因为没有数字数据或数字超出类型的范围,则会引发异常(std::invalid_argumentstd::out_of_range)。
如果转换成功并且idx不是0,则idx将包含第一个未用于解码的字符的索引。这可以是最后一个字符后面的索引。
最后,整数类型允许指定一个基数,对于大于9的数字,假设字母表(a=10直到z=35)。您可以在这里找到有关floating-point numberssigned integersunsigned integers的确切格式的详细信息。
最后,每个函数都有一个重载,它接受std::wstring作为第一个参数。

数字转换为字符串

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);


这些更直接,你传递适当的数字类型,你得到一个字符串回来。对于格式化选项,您应该返回到C++03 stringsream选项并使用流操纵器,如这里的其他答案所解释的那样。
如注解中所述,这些函数返回到默认尾数精度,该精度可能不是最大精度。如果您的应用程序需要更高的精度,最好还是返回到其他字符串格式化过程。
还有一些类似的函数被命名为to_wstring,它们将返回一个std::wstring

s71maibg

s71maibg2#

如何在C++03中将数字转换为字符串

1.* 请勿使用 * itoaitof函数,因为它们是非标准函数,因此无法移植。
1.使用字符串流

#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"  
}

字符串
请注意,您还可以使用字符串流将浮点数转换为字符串,还可以根据需要设置字符串的格式,就像使用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"


您可以使用流操纵器,如std::endlstd::hex和函数std::setw()std::setprecision()等。使用字符串流的方式与使用cout的方式完全相同

请勿将std::ostringstreamstd::ostrstream混淆。后者已过时

1.使用boost lexical cast。如果您不熟悉boost,最好从一个像这个lexical_cast这样的小库开始。下载并安装boost及其文档go here。尽管boost并不属于C标准,但boost的许多库最终都得到了标准化,boost被广泛认为是最好的C库。
词法强制转换使用下面的流,所以基本上这个选项和前面的选项是一样的,只是不那么详细。

#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"
}

如何在C++03中将字符串转换为数字

1.最轻量级的选项继承自C,是函数atoi(用于整数(字母到整数))和atof(用于浮点值(字母到浮点))。这些函数采用C样式字符串作为参数(const char *),因此它们的用法 * 可能 * 被认为不是很好的C++实践。cplusplus.com提供了有关atoiatof的易于理解的文档,包括在错误输入的情况下它们的行为。但是,该链接包含一个错误,即根据标准,如果输入的数字太大而无法容纳在目标类型中,则该行为是未定义的。

#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*
}


1.使用字符串流(这次输入字符串流,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  
}


1.使用boost lexical cast

#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
}


如果输入错误,lexical_cast将抛出boost::bad_lexical_cast类型的异常

nqwrtyyt

nqwrtyyt3#

在C++17中,新函数std::to_charsstd::from_chars在头文件charconv中引入。
std::to_chars是独立于区域设置的、非分配的、非抛出的。
只提供了其他库使用的格式化策略的一个小子集(例如std::sprintf)。
std::to_chars开始,std::from_chars也是如此。
只有当两个函数来自同一个实现时,才能保证std::from_chars可以完全恢复由to_chars格式化的每个浮点值

// See en.cppreference.com for more information, including format control.
#include <cstdio>
#include <cstddef>
#include <cstdlib>
#include <cassert>
#include <charconv>

using Type =  /* Any fundamental type */ ;
std::size_t buffer_size = /* ... */ ;

[[noreturn]] void report_and_exit(int ret, const char *output) noexcept 
{
    std::printf("%s\n", output);
    std::exit(ret);
}
void check(const std::errc &ec) noexcept
{
    if (ec ==  std::errc::value_too_large)
        report_and_exit(1, "Failed");
}
int main() {
    char buffer[buffer_size];        
    Type val_to_be_converted, result_of_converted_back;

    auto result1 = std::to_chars(buffer, buffer + buffer_size,  val_to_be_converted);
    check(result1.ec);
    *result1.ptr = '\0';

    auto result2 = std::from_chars(buffer, result1.ptr, result_of_converted_back);
    check(result2.ec);

    assert(val_to_be_converted == result_of_converted_back);
    report_and_exit(0, buffer);
}

字符串
虽然它还没有被编译器完全实现,但它肯定会被实现。

uqjltbpv

uqjltbpv4#

我从StackOverflow的某个地方偷了这个方便的类来将任何可流传输的内容转换为字符串:

// 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";


很漂亮!
我也用这个函数把字符串转换成任何可流的东西,尽管如果你试图解析一个不包含数字的字符串,它不是很安全;* (它也不像上一个那么聪明)*

// 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的版本。

ibps3vxo

ibps3vxo5#

如果您仍然将其设计为一个单独的函数,那么编写简单且通用的代码就更容易了。

string IntToStr(int n)
{
  string res;
  int i;
  do
    res=char(abs(i=n%10)+48)+res;
  while(n/=10);
  return i<0 ? "-"+res : res;
}

字符串

gpfsuwkq

gpfsuwkq6#

#include <iostream>
#include <string.h>
using namespace std;
int main() {
   string s="000101";
   cout<<s<<"\n";
   int a = stoi(s);
   cout<<a<<"\n";
   s=to_string(a);
   s+='1';
   cout<<s;
   return 0;
}

字符串
输出量:

  • 000101
  • 101
  • 1011

相关问题