我正在处理一个旧的C程序,scanf
遇到了一个问题。我已经试验了很多小时,但是仍然不能让scanf
读取特定的行。
读入的行是:01/05\t\t840.81\tvisa payment (online)\tAFCU\n
使用scanf
的C代码为:
sscanf(lineIn, "%d/%d %f %[A-Z\(\)a-z0-9]s\t%[A-Za-z0-9]s",
&month, &year, &amt, &item, &supplier);
这一行正确地扫描了month
、year
、amt
和item
变量,并且可以验证值,但是无论最后使用什么格式,都无法得到要读入的supplier
的值。
有谁能建议一种能扫描所有变量的格式吗?
1条答案
按热度按时间ars1skjm1#
我无法获得供应商的价值
扫描在错误的
s
上停止。@William Pursell。%[A-Z\(\)a-z0-9]
中缺少' '
会导致无法扫描所有项目。请勿使用没有 * 宽度 * 的
"%s"
或"%[]"
。使用比数组计数小一的宽度。
%[]
之后的s
是错误的删除
"%[A-Z\(\)a-z0-9]s"
中的s
。"%[A-Z\(\)a-z0-9]"
和"%s"
是单独的扫描指令。不要使用未定义的转义
未定义
\(
和\)
。带钱的
float
勉强可以更好的是
double
。* 金钱 * 也有一大堆问题。检查转换是否成功
不要将任何数组的地址用于
%[]
传递数组第一个元素的地址。
这意味着编译完成时未启用所有警告。
保存时间。启用所有警告。
item[]
、supplier[]
中允许有空格...
%100[A-Za-z0-9 ]
转换中的空格与%n
之前的空格具有不同的含义:扫描集中的空格与空格字符匹配,而格式字符串中其他位置的空格与任何白色字符匹配,包括TAB和换行符。@chqrlie" %n"
来检测转换是否完全成功。%d
、%f
、%s
已经允许前导空格。%[]
不允许。