不使用atoi()或stoi()将C++字符串转换为整数

4

你好,我是C++的新手,正在尝试完成一项任务,在这个任务中我们需要从一个格式为txt的文件中读取大量数据。

 surname,initial,number1,number2

我曾经寻求帮助,有人建议将2个值作为字符串读取,然后使用stoi()或atoi()将其转换为整数。这很有效,但我需要使用编译参数“-std=c ++ 11”,否则会返回错误。这在我的电脑上不是问题,因为我的电脑可以处理“-std=c ++ 11”,但不幸的是,我必须在其他机器上演示程序,而这些机器没有这个选项。
是否有其他方法可以将字符串转换为整数而不使用stoi或atoi?
以下是我的代码。
while (getline(inputFile, line))
{
    stringstream linestream(line);

    getline(linestream, Surname, ',');
    getline(linestream, Initial, ',');
    getline(linestream, strnum1, ',');
    getline(linestream, strnum2, ',');
    number1 = stoi(strnum1);
    number2 = stoi(strnum2);

    dosomethingwith(Surname, Initial, number1, number2);
}

1
首先,您不应该需要为atoi使用-std=c++11。但我会避免使用atoi,因为它不允许任何错误检查。更好的解决方案是strtoi - James Kanze
这种热衷于使用stringstream的狂热,其实应该用istringstream才对啊?(我经常看到这种情况,但我不明白为什么有人会这样做。) - James Kanze
此外,针对这种格式,我会使用类似于boost::split的东西,而不是istringstream(这仍然存在将其转换为“int”的问题)。 - James Kanze
2个回答

4

我认为你可以编写自己的stoi函数。 这是我的代码,我已经测试过了,非常简单。

long stoi(const char *s)
{
    long i;
    i = 0;
    while(*s >= '0' && *s <= '9')
    {
        i = i * 10 + (*s - '0');
        s++;
    }
    return i;
}

4
首先,他没有char const*,而是一个std::string。其次,如果要让这样的函数有用,需要进行更多的错误检查。 - James Kanze

2

你已经在使用stringstream,它给你提供了这样的“功能”。

void func()
{
    std::string strnum1("1");
    std::string strnum2("2");
    int number1;
    int number2;
    std::stringstream convert;

    convert << strnum1;
    convert >> number1;

    convert.str(""); // clear the stringstream
    convert.clear(); // clear the state flags for another conversion

    convert << strnum2;
    convert >> number2;
}

为什么要简单,当你可以复杂呢?你不需要(也不一定想要)双向的 stringstream。只需使用正确字符串初始化的 istringstream 即可。 - James Kanze

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接