You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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则是记录当前已经读取的字符数,用法场景完全不同。
  • 精度的含义天差地别:
    • printf中%.2f表示输出浮点数时保留2位小数;
    • scanf中%2f的数字是宽度限制,表示最多读取2个字符来解析浮点数,精度修饰符(.*)对scanf的浮点数解析无效。

4. 修饰符的作用不同

  • 宽度修饰符:
    • printf里%5d表示输出的整数占5个字符宽度,不足补空格右对齐;
    • scanf里%5d表示最多读取5位数字的整数,遇到非数字字符就停止解析。
  • 通配符*的用法:
    • printf中%*d是用参数动态指定输出宽度,比如printf("%*d", 6, 123);会输出占6位宽度的123(补3个空格);
    • scanf中%*d表示跳过当前匹配的输入项,不把它存储到变量里,比如scanf("%*d %d", &num);会跳过第一个输入的整数,只把第二个整数存入num。

5. 空白字符的处理逻辑

  • scanf默认会自动跳过输入中的空白字符(空格、换行、制表符),除非用%c或扫描集%[]时明确处理;
  • printf不会自动添加空白字符,所有输出的空白都必须在控制字符串中明确写出(比如printf("%d %d", a, b);里的空格)。

内容的提问来源于stack exchange,提问作者Manal Imran

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 22:55:17