第一章第六节 scanf, wscanf, fscanf, fwscanf
折腾了这么久,总算轮到这两个守关大BOSS了。天天见的scanf,你是否窥探过它的内心深处?
还是先来看个图吧:

注:
1. 这里虽然只展示了%s,但实际上对%c和%[也适用,包括其对应的宽字符转换说明;
2. 控制台窗口指我们的C程序建立的控制台窗口,而不是cmd.exe,尽管在默认情况下,C程序的控制台代码页会继承自cmd(如果通过cmd启动);
3. 在这一步转换中,不存在于控制台代码页中的字符将被转换成问号(?);
4. 这是msvcrt内部的空间;
5. 这一步通常不发生转换,常见的例外是CR LF(0D 0A)被转换为LF(0A);
6. 这里省略字符串末尾的空终止符('\0');
7. C标准使用%ls匹配宽字符串,而msvcrt使用%S,与C标准不一致;
8. 这一步实际上通过调用msvcrt的_mbtowc_l函数完成。
scanf首先根据控制台代码页将输入的字符转换成对应的编码,如果转换说明是%s,则不加修改地将结果复制到调用者提供的字符数组中;如果转换说明是%S,则根据setlocale设置的多字节字符编码将结果转换为UTF-16并存储到调用者提供的字符数组中。