Rust实现从标准输入读取n组整数求和程序时sum变量值残留问题求助
解决Rust中输入缓冲区残留导致求和错误的问题
你遇到的sum值残留问题,核心原因是每次循环读取新输入时,没有清空buff字符串里的旧内容。read_line方法是把新读取的内容追加到字符串末尾,而不是覆盖原有内容,导致每次处理时,buff里是之前所有输入的拼接,求和自然就包含了旧数据,出现错误。
修复方案一:每次循环清空缓冲区
在每次读取新行前后清空buff,这样就能保证每次处理的都是当前行的内容:
use std::io::stdin; fn main() { let mut buff = String::new(); // 读取n的值 stdin().read_line(&mut buff).unwrap(); let n: i32 = buff.trim().parse().unwrap(); // 清空读取n后的缓冲区,避免影响后续读取 buff.clear(); for _ in 0..n { stdin().read_line(&mut buff).unwrap(); let sum = buff .trim() .split_whitespace() .map(|x| x.parse::<i32>().unwrap()) .sum::<i32>(); println!("{}", sum); // 循环结束后清空缓冲区,准备下一次读取 buff.clear(); } }
修复方案二:在循环内创建新的缓冲区
这种方法更直观,每次循环都新建一个独立的字符串,完全避免残留问题,代码可读性也更好:
use std::io::stdin; fn main() { let mut buff = String::new(); stdin().read_line(&mut buff).unwrap(); let n: i32 = buff.trim().parse().unwrap(); for _ in 0..n { // 每次循环新建一个缓冲区,只存当前行的内容 let mut line_buff = String::new(); stdin().read_line(&mut line_buff).unwrap(); let sum = line_buff .trim() .split_whitespace() .map(|x| x.parse::<i32>().unwrap()) .sum::<i32>(); println!("{}", sum); } }
额外补充:适配一次性输入场景
你的示例输入是3 1 2 2 2 1 3这种一次性输入的格式,上面的代码会在读取n后等待用户逐行输入。如果要适配这种一次性输入所有内容的场景,可以直接读取全部输入再处理:
use std::io::stdin; fn main() { let mut buff = String::new(); // 一次性读取所有输入内容 stdin().read_to_string(&mut buff).unwrap(); // 把所有输入解析成整数数组 let mut nums = buff .trim() .split_whitespace() .map(|x| x.parse::<i32>().unwrap()) .collect::<Vec<_>>(); // 取出第一个数字作为n let n = nums.remove(0); // 每两个数字一组求和 for i in 0..n as usize { let sum = nums[2 * i] + nums[2 * i + 1]; println!("{}", sum); } }
这个版本会一次性处理所有输入,完美匹配你给出的示例输入,输出3 4 4。
内容的提问来源于stack exchange,提问作者Blackgaurd
相关产品推荐
相关产品推荐

