使用fscanf()分割员工数据时返回值异常的技术问询
解决fscanf读取冒号分隔员工数据时返回值异常的问题
问题根源
你的fscanf调用返回2而非预期的6,核心原因有两个:
%s格式符的行为不符合需求:%s会读取所有非空白字符,包括作为分隔符的冒号。读取完第一个整数87后,%s会直接吞掉冒号及后续所有内容,导致仅成功读取tmp.num和tmp.pnom两个字段。- 薪资字段格式不匹配:示例中薪资是浮点数
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
相关产品推荐
相关产品推荐

