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

Infinite loop with string to int converter

我目前正在编写一个小程序,用于根据地理坐标(纬度和经度)计算两个城市之间的距离(我认为 Google 地图的做法与此相同)但是仅限部分城市。

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

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

下一步是将字符串向量转换为整数向量。我找到了一个非常巧妙的方法:

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

至于为什么我不使用stoiatoi,我无法得到我的编译器(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是整数向量。

以下对我有用:

#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;
}

[编辑:添加示例]

因为您使用的是 c++11

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

您应该使用引用以避免进行字符串复制

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