【发布时间】:2011-11-11 11:37:28
【问题描述】:
好吧,我正在做一个基本程序,它处理一些输入,例如:
2+2
所以,我需要加 2 + 2。
我做了类似的事情:
string mys "2+2";
fir = mys[0];
sec = mys[2];
但现在我想将“fir”添加到“sec”,所以我需要将它们转换为 Int。 我尝试了“int(fir)”,但没有成功。
【问题讨论】:
好吧,我正在做一个基本程序,它处理一些输入,例如:
2+2
所以,我需要加 2 + 2。
我做了类似的事情:
string mys "2+2";
fir = mys[0];
sec = mys[2];
但现在我想将“fir”添加到“sec”,所以我需要将它们转换为 Int。 我尝试了“int(fir)”,但没有成功。
【问题讨论】:
有多种方法可以将字符串转换为 int。
解决方案 1:使用旧版 C 功能
int main()
{
//char hello[5];
//hello = "12345"; --->This wont compile
char hello[] = "12345";
Printf("My number is: %d", atoi(hello));
return 0;
}
解决方案 2:使用 lexical_cast(最合适且最简单)
int x = boost::lexical_cast<int>("12345");
解决方案 3:使用 C++ Streams
std::string hello("123");
std::stringstream str(hello);
int x;
str >> x;
if (!str)
{
// The conversion failed.
}
【讨论】:
fir = mys[0] - '0';
好的,所以首先介绍一下为什么您尝试的方法不起作用。在您的示例中, fir 被声明为字符串。当您尝试执行与 (int)fir 相同的 int(fir) 时,您尝试了从字符串到整数的 c 样式强制转换。本质上你会得到垃圾,因为 c++ 中的 c 风格转换将运行所有可用的转换并采用第一个有效的转换。充其量你会得到代表字符2的内存值,这取决于你使用的字符编码(UTF-8,ascii等......)。例如,如果 fir 包含“2”,那么您可能会得到 0x32 作为整数值(假设为 ascii)。你真的不应该使用 c 风格的强制转换,唯一可以安全使用它们的地方是数字类型之间的转换。
如果您给定一个与示例中的字符串类似的字符串,首先您应该使用 strtok 之类的函数将字符串分成相关的字符序列(标记)。在这个简单的例子中,这将是“2”、“+”和“2”。完成后,您可以简单地在要转换为整数的字符串上调用诸如 atoi 之类的函数。
例子:
string str = "2";
int i = atoi(str.c_str()); //value of 2
但是,如果您还希望能够处理非整数,这将变得稍微复杂一些。在这种情况下,最好的办法是在操作数(+ - / * 等)上分开,然后在数字字符串上查找小数点。如果你找到了,你可以把它当作一个 double 并使用 atof 函数而不是 atoi,如果你没有,就坚持使用 atoi。
【讨论】:
你试过atoi或boost lexical cast吗?
【讨论】: