C语言学习笔记 - 37.数据类型 - scanf函数的基本用法

本知识点对应谭浩强《C程序设计(第五版)》第3章3.4.4节"用scanf函数输入数据",是C语言实现用户交互的核心基础。scanf与printf是C语言最常用的一对输入输出函数,几乎所有需要用户输入的程序都会用到。


一、教材学习建议

谭浩强《C程序设计(第五版)》整体质量优秀,但部分章节讲解不够深入,初学者学习时应重点关注以下内容:

章节类型 章节内容 学习建议
核心重点章节 第4章(选择结构)、第5章(循环结构)、第7章(函数) 这三章是C语言的灵魂,建议逐字精读。
次重点章节 第8章(指针) 难度较大但极其重要,应尽量理解。
了解性章节 第9章及以后的内容 了解基本概念即可,无需深入钻研。
补充学习 教材中"浮点数常量的表示"、"数据的溢出"等内容 依赖补码知识,待后续补码专题讲解后再深入理解。

二、scanf函数概述

2.1 核心功能

scanf函数的作用:将用户从键盘输入的字符序列,转换为指定格式的数据,并存入对应的变量中。

与直接赋值(如int i=123;)相比,scanf实现了动态输入:程序运行时由用户指定变量的值,大大增强了程序的灵活性和交互性。

2.2 基本语法

复制代码
scanf("输入控制符", 输入参数);
  • 输入控制符:指定输入数据的格式,与printf的输出控制符用法基本一致。

  • 输入参数 :变量的地址,必须在变量名前加取地址符&


三、基本用法:不含非输入控制符

这是scanf最常用、最简单的用法,格式字符串中只包含输入控制符。

3.1 代码示例

复制代码
#include <stdio.h>

int main() {
    int i; // 定义整型变量i,但不初始化
    
    printf("请输入一个整数:");
    scanf("%d", &i); // 从键盘读取一个整数,存入变量i中
    
    printf("你输入的整数是:%d\n", i);
    return 0;
}

运行过程

  1. 程序运行到scanf语句时会暂停,等待用户输入。

  2. 用户在键盘上输入123并按下回车键。

  3. scanf将输入的字符'1''2''3'转换为十进制整数123

  4. 123存入变量i对应的内存单元。

  5. 程序继续执行,输出结果:你输入的整数是:123

3.2 输入控制符说明

scanf的输入控制符与printf的输出控制符完全一致:

  • %d:输入十进制整数。

  • %c:输入单个字符。

  • %f:输入单精度浮点数。

  • %lf:输入双精度浮点数。


四、核心原理解析

4.1 为什么需要输入控制符?

关键事实 :从键盘输入的所有内容,本质上都是字符,而不是数字。

例如,当你在键盘上输入123时,操作系统接收到的不是整数123,而是三个独立的字符:'1'(ASCII码49)、'2'(ASCII码50)、'3'(ASCII码51)。

输入控制符的作用就是:将这些字符按照指定的格式转换为对应类型的数据%d告诉scanf:"请把用户输入的数字字符序列转换为一个十进制整数"。

4.2 为什么需要取地址符&

计算机内存由一个个连续的存储单元组成,每个存储单元都有一个唯一的内存地址。变量本质上是内存中一块连续存储单元的别名。

  • &是C语言中的取地址运算符

  • &i表示"获取变量i的内存地址"。

  • scanf需要知道变量的地址,才能找到变量在内存中的位置,将转换后的数据存入正确的存储单元。

通俗理解:变量就像一个盒子,地址就是盒子的编号。scanf需要知道盒子的编号(地址),才能把东西(数据)放进正确的盒子里。

初学者取巧记忆法 :如果暂时不理解地址的概念,只需记住:要给哪个变量赋值,就在变量名前面加一个&


五、要点总结

  1. scanf函数实现了程序的动态输入功能,使程序可以在运行时接收用户输入的数据。

  2. 基本语法:scanf("输入控制符", &变量名);

  3. 输入控制符与printf的输出控制符用法一致,如%d用于输入十进制整数。

  4. 从键盘输入的所有内容本质上都是字符,输入控制符负责将字符转换为对应类型的数据。

  5. 必须在变量名前加取地址符&,否则scanf无法找到变量的内存位置。

  6. 学习C语言应重点掌握第4、5、7章,这三章是后续所有编程学习的基础。

相关推荐
萧瑟余晖10 分钟前
Java深入解析篇二十二之虚拟线程
java·开发语言
油丶酸萝卜别吃38 分钟前
Java 集合类全景介绍
java·开发语言
水饺编程1 小时前
AT&T 汇编语言学习笔记开篇语
c语言·汇编·c++
Iruoyaoxh1 小时前
类和对象~
开发语言·c++
程序喵大人1 小时前
【C++进阶】STL算法与函数对象 - 04 find、count和any_of把查询写成意图
开发语言·c++·算法
Livia要学习1 小时前
Python装饰器
开发语言·python
一直都在5721 小时前
LangChain4j精讲
开发语言·人工智能
wuminyu1 小时前
虚拟线程底层ForkJoinPool的工作窃取算法机制
java·linux·c语言·jvm·c++
吹什么轩1 小时前
c++复习:c++11:lambda表达式
开发语言·c++
LeoZY_2 小时前
LinkScope 使用笔记:基于 OpenOCD 的通用硬件芯片调试助手
笔记·单片机·嵌入式硬件·开源软件