Cin在第一次循环迭代后无法执行

时间:2014-10-28 06:10:07

标签: c++

我有一个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

1 个答案:

答案 0 :(得分:1)

std::cin仅读取空白。那么你什么时候输入 124.22 / N 23.1222 / W旧金山,cin将其读作四个字符串。因此,您已为所有迭代提供了足够的输入。使用getline方法读取前面使用的完整行。