我正在读一本书并解决一些问题.问题是
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
, orn
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"