这可能听起来很愚蠢,但我只是想知道如何在C ++中将字符串解析为整数?
这是针对学校项目的,说明表说:
“仅允许使用iostream
和string
类以及system()
函数;禁止使用任何其他类或函数。”
我搜索了一下,但我发现的唯一建议是使用atoi
或atof
等类。
在解析之前已经检查了输入字符串的错误,因此它总是只包含一个整数。
我不介意用条件手动解析,但我认为这不是我老师(或任何人)的首选方式。
如果你能提供帮助,请多谢。
答案 0 :(得分:40)
所以,你可以使用system()
,呵呵?看这个工程杰作:
#include <fstream>
void download_boost() {
system("wget http://downloads.sourceforge.net/"
"project/boost/boost/1.47.0/boost_1_47_0.tar.bz2"
"?r=http%3A%2F%2Fwww.boost.org%2Fusers%2Fhistory%2F"
"version_1_47_0.html&ts=1316116936&use_mirror=kent"
" -O boost_1_47_0.tar.bz2");
}
void unpack_boost() {
system("tar --bzip2 -xf boost_1_47_0.tar.bz2");
}
void write_program() {
std::ofstream os("blah.cpp");
os << "#include \"boost/lexical_cast.hpp\"\n"
"#include <iostream>\n"
"#include <string>\n"
"int main() { std::string s; std::cin >> s;"
"int i = boost::lexical_cast<int>(s);"
"std::cout << i; }";
}
void compile_program() {
system("g++ -Iboost_1_47_0 blah.cpp");
}
void run_program() {
system("./a.out");
}
int main() {
download_boost();
unpack_boost();
write_program();
compile_program();
run_program();
}
(我假设安装了一些常用工具的典型Linux安装。)
答案 1 :(得分:2)
stringstream
最接近你想做的事情,虽然起初看起来有点麻烦。
示例:
#include <string>
#include <sstream>
// (...)
std::string str = "12345";
std::istringstream ss(str);
int num;
ss >> num;
作为功能(并进行了优化):
#include <sstream>
#include <string>
int stringToInt(const std::string &str) {
static std::istringstream ss;
ss.clear();
ss.str(str);
int num;
ss >> num;
return num;
}
在此,我通过应用std::istringstream
关键字重用 static
。我创建了一个非常简单的基准测试,证明这比不重用速度快大约2倍:http://pastebin.com/vLSmCyMF
关于线程安全的警告:正如рытфолд在评论中指出的那样,stringToInt
的上述实现不是线程安全的。如果要从多个线程安全地调用此函数,则应使用thread_local
存储类说明符(自C ++ 11起可用)。
答案 2 :(得分:2)
#include <iostream>
#include <string>
int stringToInt(const std::string &text)
{
int number = 0;
int powerIndex = 1;
for (int i = text.length() - 1; i >= 0; i--)
{
number += powerIndex * (text.at(i) - '0');
powerIndex *= 10;
}
return number;
}
std::string intToString (int number)
{
std::string text = "";
int numberHolder = number;
while (numberHolder)
{
char digit = (numberHolder % 10) + '0';
text = digit + text;
numberHolder /= 10;
}
return text;
}
int main ()
{
//Testing...
int number = stringToInt("123");
std::string text = intToString(456);
std::cout << number << "\n" << text << "\n";
return 0;
}
答案 3 :(得分:1)
std::string mystring = "12";
std::ostringstream str(mystring);
int someint;
str >> someint;
答案 4 :(得分:1)
基本上,假设std::string mystring
只包含一个整数:
以int result = 0;
开头
虽然mystring有数字
将结果乘以十
添加最大数字(字符串中的第一个)
请记住,字符“0”的值不是0
删除字符串中最大的数字
所以:
如果我有字符串“1543”,结果= 0
我们将结果乘以10:result = 0
我们添加第一个数字:result = 1
从字符串“543”中删除第一个数字
我们将结果乘以10:result = 10
我们添加第一个数字:result = 15
从字符串“43”中删除第一个数字
我们将结果乘以10:result = 150
我们添加第一个数字:result = 154
从字符串“3”中删除第一个数字
我们将结果乘以10:result = 1540
我们添加第一个数字:result = 1543
从字符串“”中删除第一个数字
字符串是空的,所以我们已经完成了
我写了代码,但后来记得这是一个家庭作业问题。