You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何该do-while循环仅每隔一次迭代才向数组写入数据?

问题分析:do-while循环中数组写入间隔丢失的原因

先看你的问题场景:想用do-while循环读取多组坐标到points_x[]和points_y[],输入非整数时终止,但现在出现了每隔一次输入才会被实际写入数组的问题。你的代码是这样的:

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]);

核心问题所在

这锅得甩给你的while判断条件!

每次执行完do块里的代码(也就是成功读取一组坐标、计数自增后),进入while判断时,你又额外读取了一组新的坐标到points_x[v]和points_y[v]里——但这组数据并没有被计入howMany,也没有让v自增。等下一次进入do块时,你会直接覆盖掉这组刚读进来的数据,相当于这组输入被“偷偷吃掉”了,自然就出现了每隔一次才留下有效数据的情况。

举个具体的例子:假设你输入1 2 3 4 5 6

  1. 第一次do块:读取1到points_x[0],2到points_y[0],howMany变成1,v变成1。
  2. 进入while判断:读取3到points_x[1],4到points_y[1],cin成功,循环继续。
  3. 第二次do块:读取5到points_x[1](直接覆盖了刚才的3),6到points_y[1](覆盖了4),howMany变成2,v变成2。
  4. 进入while判断:没有更多输入,cin失败,循环终止。
    最后数组里只有points_x[0]=1、points_y[0]=2,points_x[1]=5、points_y[1]=6,中间的3和4直接被覆盖消失了,看起来就是每隔一次写入有效数据。

修正方案

这里给你两种清晰的写法,避免逻辑混乱:

方案一:用无限循环+cin状态判断终止

把所有读取操作放在循环体内,每次读取后检查cin的状态,失败就退出,逻辑最直观:

cout << "Enter a list of points(x y): ";
while (true) {
    // 先尝试读取x坐标,失败直接退出
    cin >> points_x[v];
    if (!cin) break;
    // 再读取y坐标,失败也退出
    cin >> points_y[v];
    if (!cin) break;
    
    // 读取成功才执行后续操作
    cout << points_x[v];
    cout << points_y[v];
    howMany++;
    v++;
}

方案二:先读再循环的写法

先读取第一组数据,然后用while判断cin状态,成功就处理数据,再读下一组:

cout << "Enter a list of points(x y): ";
// 先读取第一组坐标
cin >> points_x[v] >> points_y[v];
while (cin) {
    // 处理当前组数据
    cout << points_x[v];
    cout << points_y[v];
    howMany++;
    v++;
    // 读取下一组,为下一次循环判断做准备
    cin >> points_x[v] >> points_y[v];
}

如果非要坚持用do-while,其实也可以,但需要把循环条件里读取的数据也计入计数,不过这种写法逻辑很绕,容易出错,不太推荐。

内容的提问来源于stack exchange,提问作者Olof

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:02:15