2012-01-20 48 views
0

在C++中,我只通过将字符串对象转换为字符数组来完成此操作。带数组的教程对我来说有点难理解。但是我想在没有数组的情况下进行转换。C++将std :: string转换为int,double等没有使用char数组

我确实知道如何去做:字符串是“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数组是个好主意。但这是一个不同的问题,我稍后会问。

什么是将字符串转换为整数,双精度等不使用字符数组的最佳方式。

+4

但是根据定义,字符串**是**字符数组! – littleadv

+0

你指的是std :: string吗?因为否则字符串确实是一个字符数组。 – Hari

+0

littleadv,我知道。但我想要做到这一点,没有另一个字符阵列。 – AlexSavAlexandrov

回答

8

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

如果你不想靠提升,你可以使用一个字符串流,是这样的:

但是这是相当迂回IMO

并且不要使用atoi - 这个功能在C中是有缺陷的,而且随着时间的推移它还没有变得更好。它在解析时发生错误时返回0 - 这显然存在问题,您如何区分解析字符串"0"时出现的错误。

+0

我喜欢“并且不使用atoi”! – Krizz

+0

我想这个问题是说他想要把'1234'分解成4个整数,'4','30','200'和'1000'。 –

+0

boost :: lexical_cast它是。谢谢! – AlexSavAlexandrov

-1

您可能想看看atoi函数。

+3

这个问题有C++标签,而不是C. – Krizz

2

有一个功能atoi你可以使用。这会将其转换为字符数组,但您不必执行涉及将数组索引到for循环的数学运算。

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

对于反对的atoi塞耶斯,希望他会理解这件事>>

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

最好的办法是最有效的方式,我不认为你会找到一个更好的替代品对此,或使用字符数组。

+2

'atoi'在标签为C++的问题?我希望不是。 THAT功能的设计问题很多。 – Voo

+0

C++标签太C-ish了。 – Krizz

5

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

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

ss >> x >> y; 
1

标准字符串类已经有一个成员函数可以访问到内部字符数组,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++流:

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

你也可以使用boost :: lexical_cast,它的功能基本相同。

1
  • 我建议Boost.Lexical_Cast

  • 还是看即将到来的Boost.Conversion

  • 还可以使用Boost.Spirit实现,但有些较复杂的

请参阅Herb Sutter的“庄园农场的字符串格式化程序”article

相关问题