带有字符串到 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;
}
至于为什么我不使用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是整数向量。
以下对我有用:
#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)
{ ...
我目前正在编写一个小程序,用于根据地理坐标(纬度和经度)计算两个城市之间的距离(我认为 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;
}
至于为什么我不使用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是整数向量。
以下对我有用:
#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)
{ ...