1、如果标准输入缓冲区中的前若干个字符都是空白字符,%s,%d,%f都能直接跳过并且从第一个非空白字符开始读取,但%c不能,而是直接读取。
2、%s遇到空白字符时停止,不会读取遇到的空白字符。
3、%d遇到非数字时停止读取,不会读取使之停止的字符。
4、%f遇到除了首个小数点之外的非数字时停止读取,不会读取使之停止的字符。
5、%c会读取任何字符,包括空白字符,但仅能读取一个任意字符。
6、scanf(“…”)中的字符串叫做格式化字符串,格式化字符串中含有占位符和其他字符,其他字符里有空白字符和普通字符。
7、若占位符未匹配成功,则对应的内存地址会保持原来的值。
8、在 scanf
的格式化字符串中,除占位符外的空白字符(空格、制表符、换行符等)会影响读取过程,但它们的行为和普通字符略有不同:
空白字符的作用和影响
-
普通字符匹配:
- 格式化字符串中的普通字符(非占位符、非空白字符)必须与输入缓冲区中的字符严格匹配。
- 例如:
scanf("Name: %s", name);
,输入必须包含 "Name: ",然后才是要读取的字符串。
-
空白字符的特殊处理:
- 格式化字符串中的空白字符(空格、制表符、换行符等)会匹配输入缓冲区中的任意数量的空白字符(包括零个)。
- 这意味着,如果格式化字符串中有一个空白字符,
scanf
会读取并跳过输入中的任意数量的空白字符。
示例代码
#include <stdio.h>int main() {int num;char str[20];printf("请输入一个整数:");scanf(" %d", &num); // 格式化字符串中的三个空格会被忽略,直接读取整数printf("你输入的整数是:%d\n", num);printf("请输入一个字符串:");scanf(" %s", str); // 格式化字符串中的空格会跳过输入中的所有空白字符printf("你输入的字符串是:%s\n", str);return 0;
}
输出示例
假设用户输入:
42Hello World
程序输出:
你输入的整数是:42
你输入的字符串是:Hello
关键点总结
- 格式化字符串中的空白字符会导致
scanf
跳过输入中的任意数量的空白字符。 - 这种行为允许在格式化字符串中灵活处理输入中的空白字符,而不会影响数据的读取。
- 但在某些情况下,可能会导致意外行为,例如在需要精确匹配输入格式时,需特别注意空白字符的处理。
- 其实就是格式化字符串中的空白字符具有跳过标准输入缓冲区中空白字符的功能,就像%s、%d、%f跳过为首的空白字符群一样的的功能,所以这种格式化字符串里的空白字符一般都是和%c配合使用,也就是赋予%c跳过为首的空白字符群的能力。