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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 12:25:33