c++在不使用char数组的情况下将std::string转换为int、double等

c++ Converting a std::string to int, double, etc WITHOUT using a char array

本文关键字:转换 string int double std char 情况下 数组 c++      更新时间:2023-10-16

在C++中,我只见过通过将字符串对象转换为字符数组来实现这一点。数组教程对我来说有点难以理解。但是我想在没有数组的情况下进行转换。

我确实知道怎么做:字符串是"1234"。之后,我以这种方式将文本转换为整数:

if (symol4 == "4") int_var += 4 * 1;
if (symol3 == "3") int_var += 3 * 10;
if (symol3 == "2") int_var += 2 * 100;
if (symol3 == "1") int_var += 1 * 1000; //Don't worry, I'm familiar with cycles, this code is only for explaining my algorithm

我希望你能理解这个想法。

但我不知道这是否是最好的方式。我不知道是否有一个库具有允许我这样做的功能(如果有,我不会感到惊讶)。

我不知道不使用char数组是否是个好主意。但这是我稍后要问的另一个问题。

在不使用字符数组的情况下,将字符串转换为整数、双精度等的最佳方法是什么。

boost::lexical_cast救援:int result = boost::lexical_cast<int>(input)

如果你不想依赖boost,你可以使用字符串流,比如:

std::stringstream ss;
int result;
ss << input;
ss >> result;

但这在上相当迂回

不,不要使用atoi——即使在C中,这个函数也有缺陷,而且它并没有随着时间的推移而变得更好。当解析时发生错误时,它返回0——这有一个明显的问题,即如何区分错误和解析字符串"0"

我真的不知道粘贴的代码是关于什么的,但在C++中,将字符串转换为整数或浮点的最佳方法是使用stringstream

const char* str = "10 20.5";
std::stringstream ss(str);
int x;
float y;
ss >> x >> y;

有一个函数atoi可以使用。这将它转换为一个字符数组,但您不必在for循环中对数组进行索引。

#include <stdlib.h>
...
String number = "1234";    
int value = atoi(number.c_str());
std::cout << number;
...

对于那些反对者来说,希望他能理解这一点

#include <boost/lexical_cast.hpp>
try {
    int x = boost::lexical_cast<int>( "123" );
} catch( boost::bad_lexical_cast const& ) {
    std::cout << "Error: input string was not valid" << std::endl;
}

最好的方法是最有效的方法,我认为你不会找到更好的替代方法,或者使用字符数组。

标准字符串类已经有一个成员函数,该函数允许您访问内部字符数组c_str(),因此您可以将其传递给解析整数的标准c库函数之一,例如strtol():

string s = "1234";
long n = strtol(s.c_str(), 0, 10);

如果您已经知道字符串是一个有效的整数并且不关心错误检查,那么这是最简单的代码。如果你想要完整的错误检查,你可以这样做:

char* end = 0;
errno = 0;
long n = strtol(s.c_str(), &end, 10);
if (end == 0 || *end == 0)
    throw invalid_argument("Not a number");
else if (errno == ERANGE)
    throw overflow_error("Number is out of range");
else if (errno != 0)
    throw invalid_argument("Not a number");

或者,如果你想完全避免C风格的字符数组(或者更确切地说,将它们完全隐藏在类中),你可以使用C++流:

istringstream in(s);
int n;
in >> n;

您也可以使用boost::lexical_cast,它基本上做同样的事情。

  • 我推荐Boost.Lexical_Cast

  • 或者查看即将推出的BoostConversion

  • 也可以使用BoostSpirit来实现,但有些复杂

请参阅Herb Sutter的文章"庄园农场的字符串格式"。

您可能需要查看atoi函数。