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

使用scanf扫描集读取含多小数的CSV文件时遇到问题

问题分析与解决:sscanf读取CSV数值异常

你这问题一眼就能看出症结——CSV里的时区、经纬度都是带小数的浮点数(比如-6.0、33.567),但你用了%d这个整数格式符去解析,还把变量定义成了int类型,这可不就错位了嘛!

问题根源

%d是专门用来读取十进制整数的格式符,当它遇到小数点.的时候就会停止解析,导致后续的lat、lon、alt都读不到正确的值,自然就异常了。

修正方案

两步就能搞定:

  1. 调整变量类型:把tz、lat、lon改成浮点数类型(推荐用double,精度足够),alt是整数可以保留int;
  2. 匹配对应格式符:浮点数用%lf格式符(对应C语言里的double类型),整数依然用%d。

修正后的代码如下:

char buf[400];
char station[11], city[101], state[11];
// 把时区、经纬度改成double类型,适配浮点数数据
double tz, lat, lon;
int alt;
fgets(buf, sizeof buf, file); // 已验证该语句正常
// 用%lf解析浮点数,%d解析整数,格式串和数据格式完全匹配
sscanf( buf, "%10[^,],%100[^,],%10[^,],%lf,%lf,%lf,%d", station, city, state, &tz, &lat, &lon, &alt);

额外优化提示

你的测试数据里城市名是带双引号的("BIRMINGHAM MUNICIPAL AP"),当前代码会把引号也读进city变量里。如果想自动去掉引号,可以修改格式串,明确匹配引号:

// 格式串里添加\"来匹配前后的双引号,只读取中间的城市名称
sscanf( buf, "%10[^,],\"%100[^\"]\",%10[^,],%lf,%lf,%lf,%d", station, city, state, &tz, &lat, &lon, &alt);

这样处理后,city里就只会存BIRMINGHAM MUNICIPAL AP,不会带引号了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 03:50:26