暂时无法在飞书文档外展示此内容
1、引入
1.1、什么是输入和输出?
- 想象一下你在玩一个游戏,游戏需要你给它一些信息,比如你的名字或者你想选择的角色。这个过程叫做“输入”。
- 当游戏告诉你你的得分、下一步应该做什么,这个过程叫做“输出”。
1.2、C 语言中的输入和输出
在 C 语言中,输入和输出就像是和电脑沟通的方式
。
C 语言提供了一系列内置的函数来读取给定的输入,并根据需要填充到程序中。
C 语言也提供了一系列内置的函数来输出数据到计算机屏幕上和保存数据到文本文件或二进制文件中。
- 当你想让电脑知道一些事情,比如你想输入一个数字,C 语言会用一个特别的命令来获取这个信息。通常,我们使用
scanf
这个命令来让电脑去“听”你说什么。 - 当电脑想把信息展示给你,比如它要告诉你你输入了什么或者计算得出的结果时,就会用到“输出”。C 语言通常使用
printf
这个命令来让电脑“说”出这些信息。
2、C 实例 – Hello World
#include <stdio.h> //头文件
//空白行
/* 我们的第一个 C 程序 */ //注释
int main() //函数
{ //函数体开始
printf("Hello, World! \n"); //输出语句
return 0; //结束并返回语句
} //函数体结束
回到我们之前写的第⼀个 C 实例 – Hello World 程序中这一行,我们今天就来详细讲解一下!
- 下一行
printf(...)
是一个C 库的函数
,会把 “Hello, World!” 的字符串内容打印到屏幕上显示。来自 – (2.2)基本程序结构
3、背景了解 - 底层逻辑标准文件
C 语言把所有的设备都当作文件。所以设备(比如显示器)被处理的方式与文件相同。以下三个文件会在程序执行时自动打开,以便访问键盘和屏幕。
标准文件 | 文件指针 | 设备 |
---|---|---|
标准输入 | stdin | 键盘 |
标准输出 | stdout | 屏幕 |
标准错误 | stderr | 屏幕 |
文件指针是访问文件的方式,输入(printf)和输出(scanf)
从键盘上读取值以及如何把结果输出到屏幕上。
4、背景熟悉 - 库函数
在 (2.3)头文件的2.5、做一个试验
的章节解释过。
printf() 函数和 scanf() 函数是在标准库的头文件 stdio.h 定义的,都是库函数
。库函数是为了⽅便程序员写代码的
。库函数是由 C 语⾔给出标准后,由编译器⼚商提供的⼀组现成可直接使⽤的函数,这些函数⼀般是以静态库的⽅式提供的。
C 语⾔中提供了⼀系列的库函数,在这⾥可以看⼀下,后期我们⼀点点的介绍。
参考链接:https://cplusplus.com/reference/clibrary/
使⽤这个函数之前,必须在源码文件头部引⼊这个头文件。
⽐如 printf 函数的使⽤,需要包含 stdio.h ,所以你看代码的第 1⾏,就是如下所示的头文件包含, #include 是预处理指令, <> 中是头文件的名字。
#include <stdio.h>
注意:库函数的使⽤⼀定要包含对应的头文件,否则可能出现错误。
5、输入输出库函数
在 C 语言中,有三个函数可以用来在显示器上输出数据,它们分别是:
- puts():只能输出字符串,并且输出结束后会自动换行。
- putchar():只能输出单个字符。
- printf():可以输出各种类型的数据,在前面的很多章节中都进行了介绍。
printf() 是最灵活、最复杂、最常用的输出函数,完全可以替代 puts() 和 putchar(),大家一定要掌握。
在 C 语言中,有多个函数可以从键盘获得用户输入,它们分别是:
- scanf():和 printf() 类似,scanf() 可以输入多种类型的数据。
- getchar()、getche()、getch():这三个函数都用于输入单个字符。
- gets():获取一行数据,并作为字符串处理。
6、背景熟悉 - 占位符
所谓“占位符”,就是这个位置可以⽤其他值代⼊。
占位符(%)是在 C/C++语言中格式输入函数,如 scanf、printf 等函数中使用。其意义就是起到格式占位的意思,表示在该位置有输入或者输出。
全网最全占位符归纳!
先了解,底下讲完输入输出函数再举例。
格式控制符 | 说明 |
---|---|
%c | 输出一个单一的字符 |
%s | 输出一个字符串 |
%p | 输出一个指针 |
%hd、%d、%ld | 以十进制、有符号的形式输出 short、int、long 类型的整数 |
%hu、%u、%lu | 以十进制、无符号的形式输出 short、int、long 类型的整数 |
%ho、%o、%lo | 以八进制、不带前缀、无符号的形式输出 short、int、long 类型的整数 |
%#ho、%#o、%#lo | 以八进制、带前缀、无符号的形式输出 short、int、long 类型的整数 |
%hx、%x、%lx %hX、%X、%lX | 以十六进制、不带前缀(没有前导 0x 或 0X)、无符号的形式输出 short、int、long 类型的整数。如果 x 小写,那么输出的十六进制数字也小写;如果 X 大写,那么输出的十六进制数字也大写。 |
%#hx、%#x、%#lx %#hX、%#X、%#lX | 以十六进制、带前缀、无符号的形式输出 short、int、long 类型的整数。如果 x 小写,那么输出的十六进制数字和前缀都小写;如果 X 大写,那么输出的十六进制数字和前缀都大写。 |
%lld、%llo、%llx、%llu | ⼗进制/unsigned/⼋进制/⼗六进制 long long int 类型 |
%a、%A | ⼗六进制浮点数,字⺟输出为⼩写 和 ⼤写(仅 C99 有效) |
%f、%lf | 以十进制的形式输出 float、double 类型,十进制小数[-]m.dddddd,其中 d 的个数由精度指定(默认值为 6) |
%Lf | long double 类型浮点数 |
%e、%le %E、%lE | 以指数的形式输出 float、double 类型的小数。如果 e 小写,那么输出结果中的 e 也小写;如果 E 大写,那么输出结果中的 E 也大写 |
%Le | 科学计数法表示的 long double 类型浮点数 |
%g、%lg %G、%lG | 6 个有效数字的浮点数。以十进制和指数中较短的形式输出 float、double 类型的小数,并且小数部分的最后不会添加多余的 0。整数部分⼀旦超过 6 位,就会⾃动转为科学计数法。如果 g 小写,那么当以指数形式输出时 e 也小写;如果 G 大写,那么当以指数形式输出时 E 也大写 |
%zd | size_t 类型 |
%% | 输出⼀个百分号 |
%n | 已输出的字符串数量。该占位符本⾝不输出,只将值存储在指定变量之中 |
%[] | 扫描字符集合,在⽅括号中指定⼀组匹配的字符(⽐如 %[0-9] ),遇到不在集合之中的字符,匹配将会停止 |
7、printf() 函数
7.1、printf() 格式
int printf(const char *format, …) 函数把输出写入到标准输出流 stdout ,并根据提供的格式产生输出。
- format 可以是一个简单的常量字符串,但是您可以分别指定 %s、%d、%c、%f 等来输出或读取字符串、整数、字符或浮点数。还有许多其他可用的格式选项,可以根据需要使用。
- 详细格式
printf(<格式控制字符串>, <输出参数表>);
<格式控制字符串>:格式转换说明符、普通字符
<输出参数表>:需要输出的数据项的列表
7.2、demo
(1)最简单的 demo:
printf("C语言");
这个语句如下输出:
C语言
(2)加上参数(可以使⽤多个占位符):
printf("%s, %s! \n", "Hello", "world");
<格式控制字符串> – “%s, %s! \n”
<输出参数表> – “Hello”, “world”
%s
,s 是 string 的简写,意思是输出一个字符串,%s 表示以字符串的形式输出。%s 与 “Hello” 是对应的,也就是说,会用 “Hello” 的值来替换 %s。
printf("Hello, World! \n");
(3)再看个复杂点的 demo:
int a=100;
int b=200;
int c=300;
printf("a=%d, b=%d, c=%d", a, b, c);
会在屏幕上显示:
a=100, b=200, c=300
%d 与后面的变量是一一对应的
,第一个 %d 对应第一个变量,第二个 %d 对应第二个变量……
7.3、换⾏符 \n
由于 printf() 不会在⾏尾⾃动添加换⾏符
,运⾏结束后,光标就停留在输出结束的地⽅,不会⾃动换⾏。
为了让光标移到下⼀⾏的开头,在输出文本的结尾,添加⼀个换⾏符 \n 。
\n
是一个整体,组合在一起表示一个换行字符。换行符是 ASCII 编码中的一个控制字符,无法在键盘上直接输入,只能用这种特殊的方法表示,被称为转义字符,我们在之前(2.6)常量 - 转义字符 - ASCII 码一节中的转义字符有具体讲解。
所谓换行,就是让文本从下一行的开头输出,相当于在编辑 Word 或者 TXT 文档时按下回车键。
7.4、printf 函数说明(细节)
- 格式字符中,除了 X、E、G 外,其他均用小写字母,如“%d”不能写成“%D”。
- 不同类型的数据应使用相应类型的格式字符说明其输出形式。
- 如需输出双引号,应在“格式控制”中表示为转义字符的形式并用单引号引起来,即“\””。
- 如需输出字符“%”,在“格式控制”中用连续两个“%”即可。
如:printf(“%d%%”,s);
- 当“格式控制”中格式符个数少于输出表中的输出项时,多余的输出项不予输出。
- 当“格式符”多于输出项时,结果为不定值。
8、常用占位符实例(基础)
8.1、整数占位符:
%d:用于输出有符号整数。
%u:用于输出无符号整数。
%x:用于输出无符号十六进制整数(小写)。
%X:用于输出无符号十六进制整数(大写)。
#include <stdio.h>
int main() {
int num = 42;
printf("整数:%d\n", num);
printf("无符号整数:%u\n", (unsigned int)num);
printf("十六进制(小写):%x\n", num);
printf("十六进制(大写):%X\n", num);
return 0;
}
8.2、字符和字符串占位符:
%c:用于输出单个字符。
%s:用于输出字符串。
#include <stdio.h>
int main() {
char ch = 'A';
char str[] = "Hello, World!";
printf("字符:%c\n", ch);
printf("字符串:%s\n", str);
return 0;
}
8.3、浮点数占位符:
%f:用于输出浮点数。
%e:用于输出指数形式的浮点数(小写)。
%E:用于输出指数形式的浮点数(大写)。
%g:用于选择最合适的格式(%f 或%e)。
%G:用于选择最合适的格式(%F 或%E)。
int main() {
double pi = 3.14159;
printf("浮点数:%f\n", pi);
printf("指数形式(小写):%e\n", pi);
printf("指数形式(大写):%E\n", pi);
printf("自动选择格式:%g\n", pi);
return 0;
}
8.4、指针占位符:
%p:用于输出指针的值.
int main() {
int num = 42;
int *ptr = #
printf("指针:%p\n", ptr);
return 0;
}
9、scanf() 函数
- scanf() 函数 是 scan format 的缩写,意思是格式化扫描,也就是从键盘获得用户输入,和 printf 的功能正好相反。
- 程序运行到这个语句时,会停下来,等待用户从键盘输⼊。
- 用户输⼊数据、按下回车键后, scanf() 就会处理⽤⼾的输⼊,将其存⼊变量。
9.1、scanf() 格式
int scanf(const char *format, …) 函数从标准输入流 stdin 读取输入,并根据提供的 format 来浏览输入。
- format 可以是一个简单的常量字符串,但是您可以分别指定 %s、%d、%c、%f 等来输出或读取字符串、整数、字符或浮点数。还有许多其他可用的格式选项,可以根据需要使用。
- 详细格式
scanf(<格式控制字符串>, <变量地址列表>);
<格式控制字符串>:格式转换说明符、输入分隔符。
<变量地址列表>:若干输入变量的地址
第⼀个参数
是占位符(与 printf() 的占位符基本⼀致),需要提取的数据是什么类型
。
**其余参数
**就是存放用户输⼊的变量,格式字符串里面有多少个占位符,就有多少个变量。
9.2、demo
(1)最简单的 demo:
scanf("%d", &i);
上⾯示例中, scanf() 的第⼀个参数 %d
,表示用户输⼊的应该是⼀个整数。 %d 就是⼀个占位符, % 是占位符的标志, d 表示整数。第⼆个参数 &i
表示,将用户从键盘输⼊的整数存⼊变量 i 。
注意 1:
&
称为取地址符,也就是获取变量在内存中的地址。
注意 2:
变量前⾯必须加上 & 运算符(指针变量除外),因为 scanf() 传递的不是值,⽽是**
地址
**,即将变量 i 的地址指向用户输⼊的值。如果这⾥的变量是地址,⽐如(指针变量,字符串变量),那就不⽤加 & 运算符。
其他更高级的内容请看下下一节课(9)输入 & 输出语句(2)
每日一更!
公众号、CSDN等博客:小菜狗编程笔记
谢谢点赞关注哈!目前在飞书持续优化更新~
日更较慢有需要完整笔记请私我,C/C++/数据结构-算法/单片机51-STM32-GD32-ESP32/嵌入式/Linux操作系统/uboot/Linux内核-驱动-应用/硬件入门-PCB-layout/Python/后期小程序和机器学习!