示例输入行中读取的scanf格式是什么?

lyr7nygr  于 2022-12-29  发布在  其他
关注(0)|答案(1)|浏览(137)

我正在处理一个旧的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);

这一行正确地扫描了monthyearamtitem变量,并且可以验证值,但是无论最后使用什么格式,都无法得到要读入的supplier的值。
有谁能建议一种能扫描所有变量的格式吗?

ars1skjm

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已经允许前导空格。%[]不允许。
int main(void) {
  const char *lineIn = "01/05\t\t840.81\tvisa payment (online)\tAFCU\n";

  int month, year;
  double amt;
  char item[90 + 1];
  char supplier[100 + 1];

  // sscanf(lineIn,"%d/%d %f %[A-Z\(\)a-z0-9]s\t%[A-Za-z0-9]s",
  //    &month,&year,&amt,&item,&supplier);

  int n = 0;
  sscanf(lineIn, "%d /%d%lf %90[A-Z()a-z0-9 ] %100[A-Za-z0-9 ] %n", //
      &month, &year, &amt, item, supplier, &n);
  if (n == 0 || lineIn[n]) {
    puts("Failed");
  } else {
    puts("Success");
  }

}

相关问题