如何在Dart中模拟scanf?附C转Dart代码及优化咨询
原C代码的Dart实现优化方案
原C代码
#include <stdio.h> void main() { double a,b; printf("a b? "); scanf("%lf%lf",&a,&b); printf("a=%lf b=%lf\n",a,b); }
你当前的Dart实现
import "dart:io"; void main() { stdout.write("a b? "); var line = stdin.readLineSync(); var tokens = line?.split(RegExp(r'\s+')); double a = double.tryParse(tokens?[0] ?? '0') ?? 0; double b = double.tryParse(tokens?[1] ?? '0') ?? 0; print("a=$a b=$b"); }
优化方向与实现
你的代码已经完成了核心功能,可以从错误处理、代码健壮性、可读性三个维度进行优化:
1. 增强错误提示,提升用户体验
当前代码在输入为空、参数不足或输入非数字时会默认赋值0,属于静默错误,用户无法感知问题。可以增加明确的校验和提示:
import "dart:io"; void main() { stdout.write("a b? "); final line = stdin.readLineSync(); // 处理空输入 if (line == null || line.trim().isEmpty) { print("错误:输入不能为空,请输入两个用空格分隔的数字"); return; } // 拆分输入并过滤空token(处理多连续空格) final tokens = line.split(RegExp(r'\s+')).where((s) => s.isNotEmpty).toList(); // 校验参数数量 if (tokens.length < 2) { print("错误:请输入两个数字,当前仅输入${tokens.length}个"); return; } // 解析数字并校验有效性 final a = double.tryParse(tokens[0]); final b = double.tryParse(tokens[1]); if (a == null || b == null) { print("错误:输入无效,请输入有效的数字"); return; } print("a=$a b=$b"); }
2. 简化代码,保留容错性
如果不需要复杂的错误提示,仅希望代码更简洁健壮,可以利用Dart的elementAtOrNull(2.13+)和空安全特性简化:
import "dart:io"; void main() { stdout.write("a b? "); // 处理空输入、拆分并过滤空token final tokens = stdin.readLineSync()? .split(RegExp(r'\s+')) .where((s) => s.isNotEmpty) .toList() ?? []; // 安全获取token,避免索引越界 final a = double.tryParse(tokens.elementAtOrNull(0) ?? '') ?? 0; final b = double.tryParse(tokens.elementAtOrNull(1) ?? '') ?? 0; print("a=$a b=$b"); }
优化点说明
- 过滤空token:用
where((s) => s.isNotEmpty)处理多个连续空格产生的空字符串,避免解析无效内容 - 安全索引:
elementAtOrNull替代直接tokens?[0],避免索引越界报错 - 不可变变量:用
final替代var,符合Dart不可变优先的最佳实践 - 错误透明化:第一种优化方案明确提示错误类型,帮助用户修正输入
内容的提问来源于stack exchange,提问作者phasis
相关产品推荐
相关产品推荐

