当前位置: 首页 > news >正文

【C语言】scanf函数完全指南(与数据类型变量联动)——新手必看

接上一篇《数据类型与变量详解》,本文讲解如何用scanf从键盘读取输入存入变量。

适合:C语言初学者 | 刚学完变量 | 总遇到scanf跳过的同学
难度:⭐☆☆☆☆(1/5)

目录

1. 思维导图(文字版)
2. scanf的基本用法
3. scanf与各种数据类型的搭配
4. 常见问题与避坑(缓冲区问题、&符号、空格处理)
5. 完整代码示例(可直接运行)

---

一、思维导图(文字版)

```text
scanf 输入函数

├── 头文件
│ └── #include <stdio.h>

├── 基本格式
│ └── scanf("格式控制字符串", &变量1, &变量2, ...);

├── 格式说明符(核心)
│ ├── %d → int(整型)
│ ├── %hd → short
│ ├── %ld → long
│ ├── %lld→ long long
│ ├── %u → unsigned int
│ ├── %f → float(注意:不是%lf)
│ ├── %lf → double(牢记!)
│ ├── %c → char(字符)
│ ├── %s → 字符串(数组)
│ └── %x/%o → 十六进制/八进制

├── 特殊规则
│ ├── 变量前面必须加 &
│ ├── 字符串(数组)不加 &
│ ├── %c 会读空格/回车 —— 容易踩坑
│ └── 输入格式必须与格式串匹配

└── 返回值
└── 成功读取的变量个数
```

---

二、scanf的基本用法

```c #include <stdio.h> int main() { int age; printf("请输入年龄: "); scanf("%d", &age); // 注意 & 符号 printf("年龄是: %d\n", age); return 0; }


```

关键点:

· & 是取地址符,告诉scanf“变量的位置在哪”
· 忘记写& → 程序崩溃或乱读数据(常见错误)

---

三、scanf与各种数据类型的搭配

变量类型 格式符 示例
int %d scanf("%d", &num);
short %hd scanf("%hd", &s);
long %ld scanf("%ld", &L);
long long %lld scanf("%lld", &ll);
unsigned int %u scanf("%u", &u);
float %f scanf("%f", &f);
double %lf scanf("%lf", &d);
char %c scanf("%c", &ch);
char[](字符串) %s scanf("%s", str);(不用&)

示例代码

```c int i; float f; double d; char c; char name[100]; scanf("%d", &i); // 整数 scanf("%f", &f); // float(必须 %f,不是 %lf) scanf("%lf", &d); // double(必须 %lf) scanf("%c", &c); // 字符 scanf("%s", name); // 字符串,不用& ``` ---

四、常见问题与避坑指南

坑1:double 用了 %f

```c double d; scanf("%f", &d); // 错误!double必须用 %lf scanf("%lf", &d); // 正确 ```

printf 中 double 可以用 %f,但 scanf 中 double 必须 %lf,两者不同。

坑2:忘记 &

```c int x; scanf("%d", x); // 错误!x没写&,程序崩溃 scanf("%d", &x); // 正确 ```

坑3:%c 会读走上次的回车(缓冲区残留)

```c int n; char ch; scanf("%d", &n); scanf("%c", &ch); // 这个会读走回车符,而不是新输入的字符 ```

解决方案1(用空格吃掉残留):

```c scanf("%d", &n); scanf(" %c", &ch); // 注意 %c 前有个空格 ```

解决方案2(用 getchar() 吃掉回车):

```c scanf("%d", &n); getchar(); // 吃掉回车 scanf("%c", &ch); ```

坑4:%s 不能读空格

```c char str[100]; scanf("%s", str); // 输入 "hello world" → 只读 "hello" ```

要读带空格的字符串,用 fgets(str, 100, stdin);

坑5:一次读取多个变量时,输入格式要匹配

```c int a, b; scanf("%d,%d", &a, &b); // 必须输入 3,5(有逗号) scanf("%d %d", &a, &b); // 推荐用空格分隔,输入 "3 5" ```

---

五、完整代码示例(可直接运行)

```c #include <stdio.h> int main() { // === 整型家族 === int iNum; short sNum; long lNum; long long llNum; unsigned int uNum; printf("===== 整型输入 =====\n"); printf("请输入int: "); scanf("%d", &iNum); printf("请输入short: "); scanf("%hd", &sNum); printf("请输入long: "); scanf("%ld", &lNum); printf("请输入long long: "); scanf("%lld", &llNum); printf("请输入unsigned int: "); scanf("%u", &uNum); // === 浮点型 === float fVal; double dVal; printf("\n===== 浮点型输入 =====\n"); printf("请输入float: "); scanf("%f", &fVal); printf("请输入double: "); scanf("%lf", &dVal); // === 字符与字符串 === char ch; char name[100]; printf("\n===== 字符/字符串输入 =====\n"); printf("请输入一个字符: "); scanf(" %c", &ch); // 空格处理残留回车 printf("请输入字符串(不含空格): "); scanf("%s", name); // 注意:name前不加& // === 一次读取多个变量 === int x, y; printf("\n===== 多变量输入 =====\n"); printf("请输入两个整数(空格分隔): "); scanf("%d %d", &x, &y); // === 打印结果 === printf("\n===== 输出结果 =====\n"); printf("整型: %d, %hd, %ld, %lld, %u\n", iNum, sNum, lNum, llNum, uNum); printf("浮点型: %.2f, %.2lf\n", fVal, dVal); printf("字符: %c\n", ch); printf("字符串: %s\n", name); printf("两数之和: %d + %d = %d\n", x, y, x + y); return 0; }


```

运行示例:

```
===== 整型输入 =====
请输入int: 100
请输入short: 200
请输入long: 123456
请输入long long: 9876543210
请输入unsigned int: 4000000000

===== 浮点型输入 =====
请输入float: 3.14
请输入double: 3.1415926

===== 字符/字符串输入 =====
请输入一个字符: A
请输入字符串(不含空格): Hello

===== 多变量输入 =====
请输入两个整数(空格分隔): 10 20

===== 输出结果 =====
整型: 100, 200, 123456, 9876543210, 4000000000
浮点型: 3.14, 3.14
字符: A
字符串: Hello
两数之和: 10 + 20 = 30
```

---

六、scanf返回值(进阶)

```c int result = scanf("%d %d", &a, &b); // 返回成功读取的变量个数 // 如果读到文件末尾或出错,返回 EOF(-1) if (scanf("%d", &n) != 1) { printf("输入不合法\n"); } ```

---

七、格式符速查表(贴墙上)

类型 scanf格式符 示例
int %d scanf("%d", &n)
short %hd scanf("%hd", &s)
long %ld scanf("%ld", &L)
long long %lld scanf("%lld", &ll)
unsigned int %u scanf("%u", &u)
float %f scanf("%f", &f)
double %lf ⚠️ scanf("%lf", &d)
char %c scanf(" %c", &ch) ⚠️
字符串 %s scanf("%s", str)

⚠️ 标记的是最容易出错的地方

---

八、总结(背下这5点)

1. 变量前面必须有&(字符串数组除外)
2. double必须用%lf(和printf不同,易错)
3. %c前加空格防止读入残留的回车
4. %s不能读空格,如需读取带空格的字符串,用fgets
5. 检查返回值可以判断输入是否成功

---
如果觉得有用,欢迎 点赞 + 收藏 + 转发

http://www.jsqmd.com/news/711528/

相关文章:

  • TrollInstallerX终极指南:iOS 14-16.6.1设备一键安装TrollStore教程
  • 终极鼠标键盘自动化神器:KeymouseGo完整使用指南
  • LattePanda Mu x86计算模块评测与性能分析
  • 2026年4月电磁流量计十大厂家选型推荐
  • 一键部署Phi-3.5-mini-instruct:支持中英双语的代码辅助助手
  • Arm SVE2指令集架构与加密加速技术解析
  • NVIDIA H100与TensorRT-LLM加速AI推理性能解析
  • ARM架构MAIR寄存器配置与性能优化指南
  • 第90篇:AI在游戏行业的颠覆性应用——NPC智能、场景生成与自动化测试(项目实战)
  • KDE Plasma暗色光标主题安装与深度定制指南
  • ESP32智能硬件开发终极指南:如何用Arduino-ESP32构建物联网应用
  • 3步掌握Tiktokenizer:彻底解决你的AI令牌管理难题
  • 从开机到满格信号:你的手机是如何“认路”和“选家”的?深入浅出解析PLMN选择全流程
  • 5分钟快速上手:用SRWE彻底释放你的游戏窗口分辨率潜能 [特殊字符]
  • 麒麟V10SP1环境搭建(qt5.12.6+mysql5.7.42+ni-visa)
  • 实时视频翻译系统架构与性能优化实践
  • Rhino(犀牛) 8.13安装包免费下载
  • Optuna与Claude Code在Hugging Face上的超参数优化实践
  • 从BEAST到POODLE:一个漏洞猎人眼中的TLS 1.0消亡史
  • 亲子乐园加盟权威推荐榜:四家实力品牌深度解析 - 优质品牌商家
  • Kubernetes与Serverless的融合实践:从Knative到OpenFaaS的全面指南
  • 5个核心模块:解锁RPG Maker MV/MZ专业级开发能力
  • ARM GICv3 PPI中断寄存器详解与应用实践
  • Nature Reviews Cancer(IF=66.8)澳门科技大学张康教授等团队:人工智能推动多组学与临床数据整合在基础和转化癌症研究中的进展
  • 云原生环境中的监控与可观测性最佳实践:从Prometheus到Jaeger的全面指南
  • 机器人视觉动作生成中的RFG去噪技术解析
  • 3步轻松解密网易云音乐NCM文件:解锁你的音乐自由之旅
  • 第91篇:可解释性AI(XAI)入门——如何理解并信任黑盒模型的决策?(概念入门)
  • AI批量生成前端代码,初级前端真的要失业了吗?
  • Audiveris终极指南:三步完成纸质乐谱到数字音乐的智能转换