为什么此do-while循环仅每隔一个循环就写入一次数组?

时间:2019-09-29 14:46:05

标签: c++

do while循环的目的是将坐标(或点)输入两个数组:points_x []和points_y []。当用户输入非整数输入时,循环将停止。由于某种原因,只有其他所有cin实际上都写入阵列。有人知道为什么吗?

cout << "Enter a list of points(x y): ";
do
{
    cin >> points_x[v];
    cout << points_x[v];
    cin >> points_y[v];
    cout << points_x[v];
    howMany++;
    v++;
} while (cin >> points_x[v] && cin >> points_y[v]);

2 个答案:

答案 0 :(得分:1)

在这里您正在阅读两次(每个坐标x和y一次)

cin >> points_x[v];
cout << points_x[v];
cin >> points_y[v];
cout << points_x[v];

我认为您的意思是“一分钱”。

然后增加将结果写入数组时使用的索引。

v++;

然后,您在评估循环条件的同时再次读入每个坐标:

while (cin >> points_x[v] && cin >> points_y[v])

我认为您的意思是成为第二个“ cin”。

条件(即第二个“ cin”)期间的读数已写入下一个索引,
但是体内的读数随后会再次写入相同的索引(覆盖读取条件中的值)。

因此,最后,每个xy输入两次,一次在条件中被忽略,一次在循环体内“幸存”。

答案 1 :(得分:0)

由于输入可以是多个数字,因此最好以字符串形式输入,检查每个数字是否为数字,并在转换为整数后进行赋值。参见摘要:

bool IsAlpha(string s) {    
    for (const auto& c : s)
        if (isalpha(c)) return true;
    return false;
}

void main()

{     
    string str;
    cout << "Enter a list of points(x y):";

    while(true)
    {
        cout << "\n Enter X ";
        cin >> str;
        if (IsAlpha(str)) break;
        points_x[v] = std::stoi(str);
        cout << "  " << points_x[v] ;

        cout << "\n Enter Y ";
        cin >> str;
        if (IsAlpha(str)) break;
        points_y[v] = std::stoi(str);
        cout << points_y[v] << "  ";

        howMany++; 
        v++;
    };

}