【发布时间】:2020-07-15 12:25:48
【问题描述】:
我浏览了一些东西以找出答案,但没有找到合适的东西(或者我是一个糟糕的搜索者)。
现在我正在从 stdio.h 头文件中学习 scanf 函数,他们说这里不推荐使用转义序列,因为它会“混淆”输入,但实际上会发生什么?我测试了一些代码并得到了不同 ES 的结果:
#include <stdio.h>
int main(void)
{
int a, b, c;
printf("Enter values: \n");
scanf("%d%d%d\n", &a, &b, &c);
printf("The values are %d, %d and %d.\n", a, b, c);
}
Enter values:
1
2
3
randomstuff
The values are 1, 2 and 3.
'\t' 序列也是如此——它要求再输入一个值(我输入了 'randomstuff'),它没有存储在任何地方。 另一方面,'\a' 和 '\b' 表现不同,不会影响输入:
...
scanf("%d%d%d\a", &a, &b, &c);
printf("The values are %d, %d and %d.\n", a, b, c);
}
Enter values:
1
2
3
The values are 1, 2 and 3.
当我弄乱 ES 的位置时,它变得更加混乱。 '\n' 和 '\t' 停止影响输入:
...
scanf("%d\t%d\n%d", &a, &b, &c);
printf("The values are %d, %d and %d.\n", a, b, c);
}
Enter values:
1
2
3
The values are 1, 2 and 3.
而 '\a' 和 '\b' 开始产生一些影响:
...
scanf("%d\b%d%d", &a, &b, &c);
printf("The values are %d, %d and %d.\n", a, b, c);
}
Enter values:
1
The values are 1, 0 and 32766.
有人说 ES 不被 scanf() 解释,只是被视为普通字符,但这似乎也不正确,因为它确实按照规则解释了像 \' 或 \" 这样的 ES。
那么发生了什么? PS,为什么最后的结果是0和32766?
【问题讨论】:
-
if (scanf("%d\b%d%d", &a, &b, &c) != 3) exit(EXIT_FAILURE); -
转义序列只是字符,
scanf() 像处理任何其他字符一样处理它们。 -
scanf's Format Specification Fields 表示“空白字符:空白 (' '); 制表符 ('\t'); 或换行符 ('\n')。空白字符导致 scanf 读取,但不存储输入中的所有连续空白字符,直到下一个非空白字符。格式中的一个空白字符匹配任何数字(包括 0)和组合输入中的空白字符数。" -
...但作为格式说明符
%d和%f和%s自动过滤前导空格,不需要显式过滤它。%c和%[...](和%n)没有。