printf函数与scanf函数中控制字符串的区别是什么?
printf与scanf控制字符串的核心区别
1. 核心定位不同
- printf的控制字符串是指导数据如何格式化输出,把程序中的变量/值转换成人类可读的字符串打印到终端或文件。
- scanf的控制字符串是指导如何解析输入的字符流,把用户输入的字符序列转换成对应类型的数据,存储到指定变量中。
2. 参数传递要求不同
- printf传的是变量的值(或字符串的地址),比如:
printf("年龄:%d\n", age); - scanf必须传变量的内存地址(数组名、字符串指针除外,因为它们本身就是地址),需要用
&取地址符,比如:scanf("%d", &age);
3. 格式符的差异
- 独有格式符:
- scanf支持
%[]扫描集,用来匹配指定范围的字符,比如%[a-z]会读取所有小写字母直到遇到非小写字母为止;printf没有这个格式符。 - printf的
%n用来记录当前已经输出的字符总数,比如printf("Hello%n", &count);执行后count会被赋值为5;scanf的%n则是记录当前已经读取的字符数,用法场景完全不同。
- scanf支持
- 精度的含义天差地别:
- printf中
%.2f表示输出浮点数时保留2位小数; - scanf中
%2f的数字是宽度限制,表示最多读取2个字符来解析浮点数,精度修饰符(.*)对scanf的浮点数解析无效。
- printf中
4. 修饰符的作用不同
- 宽度修饰符:
- printf里
%5d表示输出的整数占5个字符宽度,不足补空格右对齐; - scanf里
%5d表示最多读取5位数字的整数,遇到非数字字符就停止解析。
- printf里
- 通配符
*的用法:- printf中
%*d是用参数动态指定输出宽度,比如printf("%*d", 6, 123);会输出占6位宽度的123(补3个空格); - scanf中
%*d表示跳过当前匹配的输入项,不把它存储到变量里,比如scanf("%*d %d", &num);会跳过第一个输入的整数,只把第二个整数存入num。
- printf中
5. 空白字符的处理逻辑
- scanf默认会自动跳过输入中的空白字符(空格、换行、制表符),除非用
%c或扫描集%[]时明确处理; - printf不会自动添加空白字符,所有输出的空白都必须在控制字符串中明确写出(比如
printf("%d %d", a, b);里的空格)。
内容的提问来源于stack exchange,提问作者Manal Imran
相关产品推荐
相关产品推荐

