我需要将字符串转换为 int,并且我需要知道转换是否成功。但是数字可以为零,所以我不能使用atoi和其他人。我从文件中读取的要转换的字符串。
问问题
6937 次
3 回答
5
您可以使用此模板函数,但这不仅仅是将字符串转换为 int - 它是将字符串转换为每种类型:
template <typename T>
T ConvertString( const std::string &data )
{
if( !data.empty( ))
{
T ret;
std::istringstream iss( data );
if( data.find( "0x" ) != std::string::npos )
{
iss >> std::hex >> ret;
}
else
{
iss >> std::dec >> ret;
}
if( iss.fail( ))
{
std::cout << "Convert error: cannot convert string '" << data << "' to value" << std::endl;
return T( );
}
return ret;
}
return T( );
}
如果您想现在转换是否成功,则在 if 中返回一个特定值iss.fail()
或将第二个引用参数传递给函数,如果失败则将该值设置为 false。
你可以像这样使用它:
uint16_t my_int = ConvertString<uint16_t>("15");
如果您喜欢带有引用参数的解决方案,这里有一个示例:
#include <iostream>
#include <sstream>
#include <string>
#include <inttypes.h>
template <typename T>
T ConvertString(const std::string &data, bool &success)
{
success = true;
if(!data.empty())
{
T ret;
std::istringstream iss(data);
if(data.find("0x") != std::string::npos)
{
iss >> std::hex >> ret;
}
else
{
iss >> std::dec >> ret;
}
if(iss.fail())
{
success = false;
return T();
}
return ret;
}
return T();
}
int main(int argc, char **argv)
{
bool convert_success;
uint16_t bla = ConvertString<uint16_t>("15", convert_success);
if(convert_success)
std::cout << bla << std::endl;
else
std::cerr << "Could not convert" << std::endl;
return 0;
}
于 2012-12-11T07:09:23.040 回答
4
好的旧strtol也是可用的。在 C++ 代码中,最好使用#include <cstdio>
as std::strtol
:
#include <cstdlib>
//...
std::string str;
char *endp;
// change base 10 below to 0 for handing of radix prefixes like 0x
long value = std::strtol(str.c_str(), &endp, 10);
if (endp == str.c_str()) {
/* conversion failed completely, value is 0, */
/* endp points to start of given string */
}
else if (*endp != 0) {
/* got value, but entire string was not valid number, */
/* endp points to first invalid character */
}
else {
/* got value, entire string was numeric, */
/* endp points to string terminating 0 */
}
于 2012-12-11T07:28:00.070 回答
2
使用流(c++):
std::string intString("123");
int result;
std::stringstream stream(intString);
if (stream >> result) {
std::cout << result;
} else {
std::cout << "there was an error parsing the string";
}
于 2012-12-11T07:18:39.313 回答