Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/156.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++;使用特定类将字符串解析为整数 听起来可能很愚蠢,但我只是想知道如何将字符串解析成C++中的整数?_C++_String_Parsing_Integer - Fatal编程技术网

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();
}