C语言基础篇(4):输入输出、格式控制与条件表达
一、语句概述在 C 语言中语句是完成一定任务操作的代码。C 语言的语句分为以下五种类型说明控制语句控制程序流程如if、for、while函数调用语句调用一个函数表达式语句表达式后加分号构成语句空语句只有一个分号;复合语句用{}括起来的多条语句二、输入输出的基本概念输入 → [内存] → 输出C 语言本身不提供输入输出语句输入和输出操作是由函数库中的标准输入输出函数来实现的。这些函数以标准的输入输出设备一般为终端即键盘和屏幕为对象。常用的标准输入输出函数函数功能getchar()输入一个字符putchar()输出一个字符scanf()格式化输入printf()格式化输出gets()输入字符串puts()输出字符串三、单字符输入输出getchar与putchar3.1getchar— 从键盘读入一个字符int getchar(void);功能从标准输入键盘获得一个字符。参数void不需要参数。返回值读到的字符的 ASCII 编码值。3.2putchar— 向屏幕输出一个字符int putchar(int c);功能将字符c输出到屏幕上终端。参数c要输出的字符。返回值输出的字符的 ASCII 编码值。3.3 使用示例char c1; c1 getchar(); // 从键盘读入一个字符 // 做一些处理比如转大写 putchar(c1); // 输出该字符3.4 关于 man 手册查阅函数信息时可使用man手册结构如下字段含义NAME函数名及功能简短说明SYNOPSIS函数需要的头文件及函数原型DESCRIPTION函数的使用细节RETURN VALUE返回值四、格式化输出printfint printf(const char *format, ...);功能格式化输出。参数format— 格式化字符串包含占位符和普通字符。...— 可变参数数量根据格式化字符串中的占位符决定。返回值成功时返回打印了的字符数量。4.1 可变参数printf(hello world!\n); // 无参数 printf(a %d\n, a); // 一个参数 printf(a %d b %d\n, a, b); // 两个参数4.2 格式化字符串的组成格式化字符串由两部分组成普通字符原样输出如字母、空格、标点等。占位符需要把对应的数据转换为指定的格式。4.3 常用占位符整型数据占位符说明%d有符号十进制形式%u无符号十进制形式%o八进制形式%x十六进制形式小写字母%X十六进制形式大写字母浮点型数据占位符说明%f十进制小数形式默认保留 6 位小数%e科学计数法形式默认保留 6 位小数%g更简洁的方式输出不会有无意义的 0字符型数据占位符说明%c转换为对应的字符形式%s转换为字符串多个字符4.4 辅助控制符在%和格式字符之间可以添加辅助控制符来精确控制输出格式宽度控制n整数%nd // n 为整数指定数据宽度当n 实际数据宽度时默认右对齐左边补空格。当n 实际数据宽度时按实际宽度输出。printf(%5d, 12); // 输出 12左边补3个空格 printf(%-5d, 12); // 输出12 加 - 号左对齐右边补空格 printf(%05d, 12); // 输出00012加 0左补零精度控制.n%.nf // 用于 %f 和 %e表示保留 n 位小数 %.ns // 用于 %s表示保留前 n 个字符printf(%.2f, 3.14159); // 输出3.14 printf(%.3s, hello); // 输出hel长度修饰符修饰符整型占位符含义浮点型占位符含义l转换long类型—ll或L转换long long类型转换long double类型printf(%ld, 100L); // 输出 long 型整数 printf(%lld, 100LL); // 输出 long long 型整数输出%本身printf(%%); // 输出一个 %4.5 printf 的用途1.日常输出。2.输出菜单程序界面。3.进行输出结果的格式控制。4.6 注意事项占位符和输出参数必须一一对应否则输出结果会出错。五、格式化输入scanfint scanf(const char *format, ...);功能格式化输入。参数format— 格式化字符串。...— 可变参数需要的是地址列表不是值。返回值成功匹配到的数据项个数。5.1 核心注意点1参数必须是地址scanf需要的是变量的地址普通变量前必须加int a; scanf(%d, a); // ✅ 正确传入地址 scanf(%d, a); // ❌ 错误传入的是值如果不加会导致段错误Segmentation fault因为程序试图操作不能访问的内存空间。计算机中 0 号地址一般不能直接访问操作系统自身需要占用低地址处0~1G的内存空间。2占位符和地址参数一一对应int a, b; scanf(%d %d, a, b); // ✅ 两个占位符对应两个地址3多个数据默认以空白符分隔scanf输入多个数据时默认以空白符空格、Tab、回车作为分隔符。4占位符和类型要严格匹配int a; scanf(%d, a); // ✅ 整型用 %d float f; scanf(%f, f); // ✅ 浮点型用 %f char c; scanf(%c, c); // ✅ 字符型用 %c5匹配结束条件scanf的输入匹配在以下三种情况下结束1.遇到空白符。2.遇到非法字符。3.达到指定宽度。6%c与空白符的特殊情况空白符也是字符数据。当连续输入中包含%c时需要特别注意空白符的处理// 方法一在 %c 前加空格跳过输入中的空白符 scanf(%d %c %f, a, b, c); // 方法二%*c 表示跳过一个数据项 scanf(%d%*c%c%f, a, b, c);7scanf最后不要写\nscanf(%d\n, a); // ❌ 会导致输入结束不了格式控制字符串中如果出现了空白符则表示匹配任意多个空白符直到输入一个非空白符。六、数学函数示例sqrt#include math.h double sqrt(double x); // 开根号使用数学库时编译时需要链接数学库bashgcc sqrt.c -lm # -l 表示链接m 表示 math 库 ./a.out七、流程控制概述C 语言的程序流程由三种基本结构控制结构说明顺序结构按代码书写顺序从上到下依次执行选择结构在多种情况中选择其中一种执行循环结构满足条件时重复执行某段代码选择结构的核心思想看看符合哪种情况的条件符合条件就选择这种情况。而构造条件的方式主要依赖于关系运算和逻辑运算。八、关系运算关系运算就是做大小判断结果为真1或假0。8.1 关系运算符运算符含义大于大于等于小于小于等于等于!不等于8.2 关系运算表达式3 5 // 关系不成立 → 假0 c (a b) // 关系运算表达式 a (b c) // 先执行 b c再判断 a b a (b c) // 先判断 b c结果为 0 或 1再赋值给 a重点关系运算表达式也是有值、有类型的。C 语言中没有布尔类型使用整型int来处理关系判断的结果——真为 1假为 0。九、逻辑运算逻辑运算用于处理多个条件之间的关系。9.1 三种逻辑运算符运算符名称运算规则逻辑与一假则假两个条件都为真结果才为真||逻辑或一真则真只要有一个条件为真结果就为真!逻辑非真假相对真变假假变真9.2 使用示例// 判断 score 是否在 90~100 之间 score 95; (90 score) (score 100) // 两个条件都满足 → 真1 // 条件1 或 条件2 条件1 || 条件2 // 任一为真 → 真十、C 语言中真与假的判断规则C 语言中没有专门的布尔类型判断一个量是真还是假的规则非常简单0 为假非 0 为真。这意味着不仅仅是1代表真-1、95、字符的编码值、指针的地址值等只要不是0都是真。int i 95; 95 → 真非 0 char ch a; a 的编码值 97 → 真非 0 char *p a; // 假设地址为 0x1000 0x1000 → 真非 0 char *p NULL; // NULL 就是 0 号地址 0 → 假十一、短路特性重要11.1的短路特性i 95; (100 i) (i)解析100 i→100 95→假0左边已经是假整个表达式必定为假右边的i不再执行。短路规则左边为假时右边不执行。11.2||的短路特性a || (b c) (b - c)如果a为真非 0||左边已经为真整个表达式必定为真右边不再执行。||短路规则左边为真时右边不执行。11.3 核心规则和||运算都要求先算最左边的式子。这意味着如果最左边的值已经能确定整个表达式的结果右边就不算了。右边表达式中的副作用如i可能不会执行。