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

使用fscanf()分割员工数据时返回值异常的技术问询

解决fscanf读取冒号分隔员工数据时返回值异常的问题

问题根源

你的fscanf调用返回2而非预期的6,核心原因有两个:

  1. %s格式符的行为不符合需求:%s会读取所有非空白字符,包括作为分隔符的冒号。读取完第一个整数87后,%s会直接吞掉冒号及后续所有内容,导致仅成功读取tmp.num和tmp.pnom两个字段。
  2. 薪资字段格式不匹配:示例中薪资是浮点数4500.000000,但你用了整数格式符%d,即使前面字段读取正常,这里也会匹配失败。

解决方案

用%[^:]格式符替代%s,它会读取直到冒号为止的所有字符,完美适配冒号分隔的字段结构;同时修正薪资字段的格式符:

修正后的代码示例

假设EMP结构体中salr为float类型:

while(fscanf(pfp, "%d:%[^:]:%[^:]:%f:%[^:]:%s", &tmp.num, tmp.pnom, tmp.nom, &tmp.salr, tmp.grad, tmp.sup) == 6) {
    // 此处添加将tmp数据存入二维数组的逻辑
}

如果salr是double类型,把%f替换为%lf即可:

while(fscanf(pfp, "%d:%[^:]:%[^:]:%lf:%[^:]:%s", &tmp.num, tmp.pnom, tmp.nom, &tmp.salr, tmp.grad, tmp.sup) == 6) {
    // 后续处理逻辑
}

额外注意事项

  • 确保EMP结构体中pnom、nom、grad、sup的字符数组大小足够,避免缓冲区溢出。
  • 如果最后一个字段(示例中的13)可能包含非数字字符,可将最后一个%s替换为%[^:\n],确保读取到行尾为止。

内容的提问来源于stack exchange,提问作者charaf E.k

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 05:50:21