带字符串到int转换器的无限循环

时间:2016-02-04 11:45:52

标签: c++ windows c++11 codeblocks

我目前正在编写一个小程序,用于根据地理坐标(纬度和经度)计算两个城市之间的距离(我认为这与谷歌地图的方式相同)但仅限于数量有限的城市。

我的程序使用文件文本中的getline获取城市的名称,纬度和经度。例如,巴黎将是"巴黎48.51.12 2.20.5"。

然后,我解析该行得到a)名称,b)纬度(输入为angle.minutes.seconds),c)经度。我解析纬度和经度,得到一个带有3个相应数字的向量,但保存为字符串。

下一步是将字符串向量转换为int向量。我找到了一个非常简洁的方法:

int strtoint(string str)
{
    int i=0;
    if(!(istringstream(str)>>i)) i=0;
    return i;
}

至于为什么我不使用 stoi atoi ,我无法让我的编译器(MingW,在Code :: Blocks 13.12中)理解它们,所以也许我错过了一步。

然而,当我尝试将它与我的矢量一起使用时,它会进入一个无限循环,我不明白为什么:

for(int unsigned i=0; i<latitude.size();i++)
{
    cout<<latitude[i]<<endl;
    i_latitude[i]=strtoint(latitude[i]);
}

纬度为字符串向量,i_latitude为int向量。

以下适用于我:

#include <iostream>
#include <string>
#include <sstream>


using namespace std;

int strtoint(string str)
{
    int i=0;
    if(!(istringstream(str)>>i)) i=0;
    return i;
}

int main()
{
    string str="45";
    int nbr=strtoint(str);
    cout<<nbr<<endl<<endl; //shall return 45 as an integer

    string foo [3]= {"45", "32", "15"};
    int ifoo [3];
    for(int i=0;i<3;i++)
    {
        ifoo[i]=strtoint(foo[i]);
        cout<<ifoo[i]<<endl; //shall return 45 32 15
    }
    return 0;
}

[编辑:添加示例]

1 个答案:

答案 0 :(得分:0)

因为您使用的是c ++ 11

for( auto& s : latitude )
{
  cout<<s<<endl;
  i_latitude.push_back( strtoint(s) );
}

您应该使用引用来避免执行字符串复制

int strtoint( const string & str)
{ ...