c++在不使用char数组的情况下将std::string转换为int、double等
c++ Converting a std::string to int, double, etc WITHOUT using a char array
在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函数。
- 使用char类型将decimal转换为string,将string转换为decimal
- C++:如何将 unix 时间的字符串转换为 *tm?(使用时间错误:"cannot convert 'String' to 'tm*' ")
- 将C++ std::string 转换为 UTF-16-LE 编码的字符串
- 将日语 wstring 转换为 std::string
- 如何将带有十六进制值的 std::string 转换为 std::vector<无符号字符>
- 如何在 std::string 和 Aws::String 之间进行转换?
- C++:将模板类型 char 转换为 std::string
- 无法<string>从"常量字符 []"转换为<类名>
- 将 std::string( "x3BxDEx7C" ) 转换为可读的十六进制字符串?
- 如何在 c++ 中将向量转换为<string>常量字符* const*?
- 无法从'const std::string [3]'转换为'std::string'
- 从 std::string 转换为 const 无符号整数
- 使用 .data() 将字符数组转换为 std::string 不会转换整个数组
- 为什么std::string没有(显式)const char*强制转换
- 将单个字符转换为 std::string 前缀 \x01
- C++ 模板函数无法将"std:string"转换为"double"作为回报
- 将 std::string 转换为 const char* 用于 printf 消耗
- Swig无法将python3的字节对象转换为std::string
- 将utf16宽std::wstring转换为utf8窄std::string以获得罕见字符时出现问题
- 将 std::string 转换为 const tchar*