我有一个for循环,要求用户使用std::cin
进行输入,然后对其执行操作以获得两个经度/纬度点之间的距离。但是,在循环的第一次迭代之后,std::cin
无法执行,并再次使用存储在循环的第一次迭代中的变量。
#include<iostream>
#include<string>
#include<cmath>
#include<sstream>
#include<vector>
#include<iterator>
using namespace std;
int main()
{
string startingLocation;
int numDest;
string arrStart[3];
getline (cin, startingLocation);
stringstream ssinStart(startingLocation);
int k = 0;
string airport = "";
while (ssinStart.good() && k < 3)
{
if (k < 2)
{
ssinStart >> arrStart[k];
++k;
}
else
{
string mid;
ssinStart >> mid;
arrStart[k].append(mid);
arrStart[k].append(" ");
}
}
cin >> numDest;
string* destinations = new string[numDest];
double* distDest = new double[numDest];
string dest;
for (int i = 0; i < numDest; i++)
{
cin >> dest;
string arrDest[3];
stringstream ssinDest(dest);
int j = 0;
while(ssinDest.good() && j < 3)
{
if (j < 2)
{
ssinDest >> arrDest[j];
++j;
}
else
{
string mid;
ssinDest >> mid;
destinations[i].append(mid);
destinations[i].append(" ");
}
}
string delimiter = "/";
double lat1 = atof(arrStart[0].substr(0, arrStart[0].find(delimiter)).c_str());
double lat2 = atof(arrDest[0].substr(0, arrDest[0].find(delimiter)).c_str());
double lon1 = atof(arrStart[1].substr(0, arrStart[1].find(delimiter)).c_str());
double lon2 = atof(arrDest[1].substr(0, arrDest[1].find(delimiter)).c_str());
if (*arrStart[0].rbegin() == 'S')
{
lat1 = -lat1;
}
if (*arrDest[0].rbegin() == 'S')
{
lat2 = -lat2;
}
if (*arrStart[1].rbegin() == 'W')
{
lon1 = -lon1;
}
if (*arrDest[1].rbegin() == 'W')
{
lon2 = -lon2;
}
double dlat = lat1 - lat2;
double dlon = lon1 - lon2;
double R = 3959.9;
double a = pow(sin(dlat/2), 2) + cos(lat1) * cos(lat2) * pow(sin(dlon/2), 2);
double c = 2 * atan2(sqrt(a), sqrt(1-a));
double d = R * c;
distDest[i] = d;
}
for (int i = 0; i < numDest; i++)
{
cout << destinations[i] << ": " << distDest[i] << endl;
}
return 0;
}
输入采用起始位置,然后是目的地数量(在这种情况下为3),然后应提示用户输入3个位置。然而,在输入第一个位置之后,它在循环中迭代剩余的次数,然后在末尾输出双精度(它们相互复合)。我假设这是一个内存问题,因为在循环中定义的变量是在迭代之间进行的,但我没有运气搜索这个问题。
I
159.123/N 145.22/W Los Angeles
3
124.22/N 23.1222/W San Francisco
0
: 10919
: 9065.76
: 7619.9
答案 0 :(得分:1)
std::cin
仅读取空白。那么你什么时候输入 124.22 / N 23.1222 / W旧金山,cin将其读作四个字符串。因此,您已为所有迭代提供了足够的输入。使用getline
方法读取前面使用的完整行。