c++ - Cin 在循环的第一次迭代后无法执行

标签 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 个位置。但是,在输入第一个位置后,它会在循环中迭代剩余的次数,然后在最后输出 double 值(相互叠加)。我假设这是一个内存问题,因为循环内定义的变量在迭代之间被转移,但我没有找到这个问题的运气。

159.123/N 145.22/W Los Angeles
3
124.22/N 23.1222/W San Francisco

: 10919
: 9065.76
: 7619.9

最佳答案

std::cin 只读到 whitespace。因此,当您输入 124.22/N 23.1222/W San Francisco 时,cin 会将其读取为四个字符串。所以你已经为所有的迭代提供了足够的输入。使用 getline 方法读取您之前使用的完整行。

关于c++ - Cin 在循环的第一次迭代后无法执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26601880/

相关文章:

c++ - Irrlicht - 创建 3D 平面/立方体网格

c++ - 将参数传递给另一个可变参数函数

c++ - 具有模板参数的模板类上的赋值运算符重载

c++ - MFC 访问 lparam 抛出异常

C++ 程序崩溃

c++ - 在编译时计算基类的偏移量

c++ - 在字符串 vector 中查找字母数 C++

c++ - 在类内和类外定义节点

c++ - 如何估计相机从场景中拍摄优质图像的曝光时间

c++ - 理解 while 语句中的逻辑表达式