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

C++如何从形如(A,B)的有序对输入中提取指定数值?

问题根因
  • 格式匹配错位:单条有序对的右括号)读取完成后,输入缓冲区会残留换行符,下一轮循环首次执行cin.ignore()时会优先吃掉换行符,而非预期的下一条数据的左括号(,后续读取整数时匹配到(触发格式错误,cin进入失败状态后停止读取操作。
  • 非标准语法使用:代码中Punto arr[n]属于C语言可变长数组(VLA)语法,不属于C++标准规范,不同编译器兼容性差。
  • 鲁棒性不足:cin.ignore()默认仅跳过1个字符,若有序对内部存在空格(如( 200 , 500 )格式)会直接读取失败。
修复方案

直接通过char类型变量接收括号、逗号等分隔符,利用cin读取非字符串类型时默认跳过所有空白字符(换行、空格、制表符等)的特性处理格式问题,同时改用标准库vector存储点位数据,修复后代码如下:

#include <iostream>
#include <vector>
using namespace std;

struct Punto
{
    double x,y;
    double distancia;
    double zona;
};

int main()
{
    // 可先读取输入的点位总数n,此处示例设为和样例输入匹配的5
    int n = 5;
    vector<Punto> arr(n);
    char sep; // 用于接收分隔符
    int x, y;

    for(int i=0; i<n; i++){
        cin >> sep; // 自动跳过空白读取左括号(
        cin >> x;
        arr[i].x = x;
        cout << "Punto " << i << " x " << x << '\n';
        cin >> sep; // 读取逗号,
        cin >> y;
        arr[i].y = y;
        cout << "Punto " << i << " y " << y << '\n';
        cin >> sep; // 读取右括号)
    }

    return 0;
}
修复说明
  • 自动处理空白字符:cin读取char类型分隔符时会自动跳过所有空白,无需手动调用ignore,不会出现换行符导致的格式错位问题,同时兼容带空格的有序对格式。
  • 符合C++标准:使用vector存储点位数据,兼容性更好,后续动态调整点位数量也更灵活。
  • 逻辑更简洁:不需要手动控制忽略字符的数量,降低出错概率。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 08:36:08