有没有更好的方法来解决这个问题 - 编程原则&使用C ++的实践:Ch。 4 - 钻?

时间:2015-05-24 10:55:47

标签: c++

我解决了这个问题 -

  

编写一个由while循环组成的程序(每次都围绕着   loop)读入两个整数然后打印它们。 a时退出程序   终止' |'进入了。

使用2种方法 -

1)将输入读作 int 并将第一个与'|'进行比较 -

int i1, i2;
while (cin >> i1){
    if (i1 == '|')
        break;
    cin >> i2;
    cout << endl << i1 << " " << i2 << endl;
}

但有了这个,我无法输入124作为'|' == 124

2)将输入读作字符串并使用我创建的函数将其转换为 int ,如下所示 -

// main function
    string s1, s2;
    int i1, i2;
    while (cin >> s1){
        if (s1 == "|"){
            cout << "\nBreaking the loop\n";
            break;
        }
        cin >> s2;
        i1 = strtoint(s1);
        i2 = strtoint(s2);
        cout << endl << i1 << " " << i2 << endl;
    }

// string to int
int strtoint(string s)
{
    int i, j, val = 0, temp = 0;
    for (i = s.size() - 1; i >= 0; --i){
        temp = s[i] - '0';
        for (j = 1; j < (s.size() - i); ++j)
            temp *= 10;
        val += temp;
    }
    return val;
}

但是现在问题进一步说要读取双打,并且使用第二种方法意味着将strtoint()扩展为读取double值(这很烦人)。

我想知道的是,有没有更好的方法来解决这个问题,因为第一种方法有一个错误,第二种方法需要更多的代码。或者我应该选择第二个?

1 个答案:

答案 0 :(得分:1)

使用第二种方法,但实现这样的转换更方便:

#include <sstream>

template <typename T>
T from_string (std::string const & s)
{
    std::stringstream ss (s);
    T ret;
    ss >> ret;
    return ret;
}

您可以这样称呼它:

int a = from_string<int> (s1);
double d = from_string<double> (s2);

这不是最好的,但确实有效(希望如此)!

当然,您始终可以使用std::stoi()标题中的std::stod()<string>等功能。事实上,我建议使用上述方法。