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
相关产品推荐
相关产品推荐

