C++;使用特定类将字符串解析为整数 听起来可能很愚蠢,但我只是想知道如何将字符串解析成C++中的整数?
这是一个学校项目,说明表上写着: “仅允许使用C++;使用特定类将字符串解析为整数 听起来可能很愚蠢,但我只是想知道如何将字符串解析成C++中的整数?,c++,string,parsing,integer,C++,String,Parsing,Integer,这是一个学校项目,说明表上写着: “仅允许使用iostream和string类和system()函数;禁止使用任何其他类或函数。” 我已经搜索了一些,但我找到的唯一建议是使用类,如atoi或atof 在解析之前,已检查输入字符串是否存在错误,因此它始终只包含整数 我不介意用条件句手动解析,但我认为这不是我老师(或任何人)喜欢的方式 如果您能提供帮助,非常感谢。stringstreams最接近您想要做的事情,尽管一开始可能有点麻烦 std::string mystring = "12"; std
iostream
和string
类和system()
函数;禁止使用任何其他类或函数。”
我已经搜索了一些,但我找到的唯一建议是使用类,如atoi
或atof
在解析之前,已检查输入字符串是否存在错误,因此它始终只包含整数
我不介意用条件句手动解析,但我认为这不是我老师(或任何人)喜欢的方式
如果您能提供帮助,非常感谢。
stringstream
s最接近您想要做的事情,尽管一开始可能有点麻烦
std::string mystring = "12";
std::ostringstream str(mystring);
int someint;
str >> someint;
例如:
#include <string>
#include <sstream>
// (...)
std::string str = "12345";
std::istringstream ss(str);
int num;
ss >> num;
#包括
#包括
// (...)
std::string str=“12345”;
std::istringstream ss(str);
int-num;
ss>>num;
作为功能(并经过优化):
#包括
#包括
int stringToInt(常量std::string和str){
静态std::istringstream ss;
ss.clear();
ss.str(str);
int-num;
ss>>num;
返回num;
}
在这里,我通过应用static
关键字来重用std::istringstream
。我创建了一个非常简单的基准测试,它表明这比不重用大约快2倍:
关于线程安全的警告:正如在评论中所指出的那样,
stringToInt
的上述实现不是线程安全的。如果要从多个线程安全地调用此函数,应使用thread\u local
存储类说明符(从C++11开始提供)。基本上,给定只包含整数的std::string mystring
:
从int result=0开始代码>
而mystring有数字
将结果乘以十
添加最大数字(字符串中的第一位)
请记住,字符“0”的值不是0。
从字符串中删除最大的数字
所以:
如果我有字符串“1543”,结果=0
我们将结果乘以十:结果=0
我们添加第一个数字:结果=1
从字符串“543”中删除第一个数字
我们将结果乘以十:结果=10
我们添加第一个数字:结果=15
从字符串“43”中删除第一个数字
我们将结果乘以十:结果=150
我们加上第一位数字:result=154
从字符串“3”中删除第一个数字
我们将结果乘以十:结果=1540
我们加上第一位数字:result=1543
从字符串“”中删除第一个数字
字符串是空的,所以我们完成了
我写了代码,但后来想起这是一个家庭作业问题。\include
#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;
}
#包括
int stringToInt(常量标准::字符串和文本)
{
整数=0;
int-powerIndex=1;
对于(int i=text.length()-1;i>=0;i--)
{
数字+=powerIndex*(文本位于(i)-“0”);
功率指数*=10;
}
返回号码;
}
std::string intToString(整数)
{
std::string text=“”;
int numberHolder=数字;
while(号码持有者)
{
字符位数=(数字文件夹%10)+“0”;
文本=数字+文本;
numberHolder/=10;
}
返回文本;
}
int main()
{
//测试。。。
整数=stringToInt(“123”);
std::string text=intToString(456);
std::cout那么,你可以使用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();
}
#包括
void下载_boost(){
系统(“wgethttp://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(){
系统(“tar-bzip2-xf boost_1_47_0.tar.bz2”);
}
void write_程序(){
std::流操作系统(“blah.cpp”);
os您可以使用Boost吗?我不认为您可以使用stringstream吗?不,解释表上清楚地说“只允许使用iostream和string类以及system()函数;禁止使用任何其他类或函数。”嗯,atoi
和atof
是函数(而不是类)问你的老师,但是我不认为使用它有什么大不了的。stringstream
s是iostream类。看。std::ostream
?你可能是说std::ostringstream
。@Andy t:是的,确实!修复了它我很确定ostringstream没有操作符>>(只是我刚才在我的问题中添加了一些加粗文本的额外信息。记住在使用操作符>>之后测试str.fail()。std::ostringstream(“1234”)
太好了。我刚刚在我的问题中添加了一些加粗的信息。谢谢,安迪。我已经修改了代码,以证明stringstream
s可以重用,而ostringstream
s不能。确定我的方法是否真的更快会很有趣。我不确定。@AgentRev:从技术上讲,stringstream是标准库中的一个iostream和一个string类。@SoapBox:我用-O3开关附加了其他结果。在这种特定情况下,它似乎没有什么区别。(或者编译命令有什么问题吗?)这是假设stringstream不被允许现在这就是我所说的横向思维!文字思维。用文字思维。可爱。但是,你使用了std::ofstream
,这是不允许的。@Rob:我认为文本模棱两可,不知道它是否允许iostream
类、
头中的类或中的类iostream图书馆,但这是一份工作
#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();
}