为什么“%d”不等同于“%d”作为scanf中的格式字符串

我正在读一本书并解决一些问题.问题是

For each of the following pairs of scanf format strings, indicate
whether or not the two strings are equivalent. If they’re not, show
how they can be distinguished.

(a) "%d" veruss " %d"

(b) "%d-%d-%d" versus "%d -%d -%d"

(c) "%f" versus "%f "

(d) "%f,%f" versus "%f, %f"

我的解决方案是(a)它们是等价的,因为scanf丢弃了空白区域.对于(b)它们不等同,因为scanf匹配 – 具有空格.对于(c),它们不等效,因为scanf会将缓冲区中的空白区域放回.对于(d),它们是等价的,因为scanf丢弃白色空间.根据Chegg解决方案,所有前面的问题都不相同.我错了吗?在这篇文章中,我想确保我的答案与Chegg解决方案相比是正确的.我已经读过这本书了,而且我对scanf有很好的了解.

最佳答案 根据OP的推理,“%d”和“%d”是相同的.

它们肯定与预期的数字输入相同,如“123”和“456”.剩下的考虑因素是FILE指针失败的地方,如“abc”与“xyz”一样? “%d”本身首先消耗领先的白色空间.所以没有区别.

… A conversion specification is executed in the following steps: C11dr §7.21.6.2 7

Input white-space characters … are skipped, unless the specification includes a [, c, or n specifier. §7.21.6.2 8

然后将文本转换为数字输入(对于“%d”).

下面的代码演示了等价.

void next_testi(const char *s, const char *fmt, const char *pad) {
  rewind(stdin);
  int i = 0;
  int count = scanf(fmt, &i);
  int next = fgetc(stdin);
  printf("format:\"%s\",%s count:%2d, i:%2d, next:%2d, text:\"%s\"\n", //
      fmt, pad, count, i, next, s);
}

void next_test(const char *s) {
  FILE *fout = fopen("test.txt", "w");
  fputs(s, fout);
  fclose(fout);

  freopen("test.txt", "r", stdin);
  next_testi(s, "%d", " ");
  next_testi(s, " %d", "");
  puts("");
}

int main() {
  next_test("3");
  next_test(" 4");
  next_test("");
  next_test(" ");
  next_test("+");
  next_test(" -");
  next_test("X");
  next_test(" Y");
}

产量

format:"%d",  count: 1, i: 3, next:-1, text:"3"  // scanf() return value 1:success
format:" %d", count: 1, i: 3, next:-1, text:"3"

format:"%d",  count: 1, i: 4, next:-1, text:" 4"
format:" %d", count: 1, i: 4, next:-1, text:" 4"

format:"%d",  count:-1, i: 0, next:-1, text:""  // scanf() return value EOF, next is EOF
format:" %d", count:-1, i: 0, next:-1, text:""

format:"%d",  count:-1, i: 0, next:-1, text:" "
format:" %d", count:-1, i: 0, next:-1, text:" "

format:"%d",  count: 0, i: 0, next:43, text:"+" // scanf() return value 0
format:" %d", count: 0, i: 0, next:43, text:"+"

format:"%d",  count: 0, i: 0, next:45, text:" -"
format:" %d", count: 0, i: 0, next:45, text:" -"

format:"%d",  count: 0, i: 0, next:88, text:"X"
format:" %d", count: 0, i: 0, next:88, text:"X"

format:"%d",  count: 0, i: 0, next:89, text:" Y"
format:" %d", count: 0, i: 0, next:89, text:" Y"
点赞