C ++将字符串解析为具有特定类的整数

时间:2011-09-15 18:33:21

标签: c++ string parsing integer

这可能听起来很愚蠢,但我只是想知道如何在C ++中将字符串解析为整数?

这是针对学校项目的,说明表说: “仅允许使用iostreamstring类以及system()函数;禁止使用任何其他类或函数。”

我搜索了一下,但我发现的唯一建议是使用atoiatof等类。

在解析之前已经检查了输入字符串的错误,因此它总是只包含一个整数。

我不介意用条件手动解析,但我认为这不是我老师(或任何人)的首选方式。

如果你能提供帮助,请多谢。

5 个答案:

答案 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
从字符串“”中删除第一个数字 字符串是空的,所以我们已经完成了

我写了代码,但后来记得这是一个家庭作业问题。