格式化
printf
printf() 用于打印消息以及变量的值。
|
|
sprintf
sprintf() 不打印字符串,是将字符值和格式化结构一并存储在一个数组中。
|
|
scanf
从标准输入读取用户输入的
type | Argument & Description |
---|---|
***** | 读取标准输入用户输入的值,但不存储在对应接受的变量中 |
width | 这个操作中读取的最大字符 |
type | 指定要读取的数据类型以及预期如何读取数据 |
修饰符类型
类型 | 标识符 |
---|---|
int | %d |
char | %c |
float | %f |
double | %lf |
short int | %hd |
unsigned int | %u |
long int | %li |
long long int | %lli |
unsigned long int | %lu |
unsigned long long int | %llu |
signed char | %c |
unsigned char | %c |
long double | %Lf |
格式化
Description | Code | Result |
---|---|---|
接受字符类型保存在数组中 | scanf("%19c", &a); | ‘1234567890abcfefg’ |
整型类型 | scanf("%d", &testInteger); | ‘10’ |
多个接收值 | scanf("%d%f", &a, &b); |
scanf的缺点
- 如果存储空间不足,数据能存储到内存中,但不被保护。
- scanf 函数接收字符串时, 碰到 空格 和 换行 会自动终止。不能使用 scanf 的 %s 接收带有空格的字符串。
格式化标记符 [1]
标记符
标记符 | |
---|---|
%i / %d | int |
%c | char |
%f | float |
%s | string |
%u | unsigned decimal |
%o | octal |
%x | hexadecimal |
对字符串填充
在 % 符号后添加一个零 (0),可以对 printf 整数输出进行零填充
Code | Result |
---|---|
printf("%03d", 0); | 000 |
printf("%03d", 1); | 001 |
printf("%03d", 123456789); | 123456789 |
printf("%03d", -10); | -10 |
printf("%03d", -123456789); | -123456789 |
对于此类格式化方式总结有如下几种模式
Description | Code | Result |
---|---|---|
填充5位(默认以空白填充,左对齐填充) | printf("’%5d’", 10); | ’ 10' |
填充5位(右对齐填充) | printf("’%-5d’", 10); | ‘10 ' |
填充5位“0”(默认左对齐填充) | printf("’%05d’", 10); | ‘00010’ |
有符号的表示的数字(默认左对齐填充) | printf("’%+5d’", 10); | ’ +10’ |
有符号的表示的数字,右对齐填充空白 | printf("’%-+5d’", 10); | ‘+10 ' |
浮点数格式化
Description | Code | Result |
---|---|---|
保留1位小数 | printf("’%.1f’", 10.3456); | ‘10.3’ |
保留2位小数 | printf("’%.2f’", 10.3456); | ‘10.35’ |
整数位最少8位宽度,小数位2位 | printf("’%8.2f’", 10.3456); | ’ 10.35’ |
整数位最少8位宽度,小数位4位 | printf("’%8.4f’", 10.3456); | ’ 10.3456' |
整数位最少8位,小数位2位,不足8位将用0填充(默认左对齐填充) | printf("’%08.2f’", 10.3456); | ‘00010.35’ |
整数位最少8位,小数位2位,不足8位将用空白右对齐填充 | printf("’%-8.2f’", 10.3456); | ‘10.35 ' |
打印更大的浮点数,小数位2位 | printf("’%-8.2f’", 101234567.3456); | ‘101234567.35’ |
字符串格式化
Description | Code | Result |
---|---|---|
字符串输出 | printf("’%s’", “Hello”); | ‘Hello’ |
保证输出结果是10位,不足位用空白填充(默认左对齐填充) | printf("’%10s’", “Hello”); | ’ Hello’ |
保证输出结果是10位,不足位用空白右对齐填充 | printf("’%-10s’", “Hello”); | ‘Hello ' |
特殊字符
\a | audible alert |
\b | backspace(退格) |
\f | form feed (换页) |
\n | newline(换行) |
\r | carriage return(回车) |
\t | tab |
\v | vertical tab(垂直制表符) |
\ | backslash (反斜杠) |
运算符
C语言中运算符优先级为下表所示
优先级 | 运算符 | 说明 | 关联性 |
---|---|---|---|
1 | ++ -- | 前缀/后缀 自增/减 | 从左向右 |
() | 函数调用 | ||
[] | 数组下标 (subscripting) | ||
. | 结构体成员访问 | ||
-> | 指针结构体成员访问 | ||
2 | ++ -- | 前缀/后缀 自增/减 | 从右向左 |
+ - | (Unary) 一元 +/-(正负号) | ||
! ~ | 逻辑非与按位非 | ||
(type) | 转换 | ||
* | 取消引用 | ||
& | 地址符 | ||
sizeof | Size-of | ||
3 | * / % | Multiplication, division, remainder | 从左向右 |
4 | + - | Addition and subtraction | |
5 | << >> | Bitwise left shift and right shift | |
6 | < <= > >= == != | 关系运算符 < , ≤ , > , ≥ ,= , ≠ | |
7 | & | 按位与 | |
8 | ^ | 按位异或 | |
9 | ` | ` | 按位异或 |
10 | && | 逻辑与 | |
11 | ` | ` | |
12 | ?: | 三元运算(Ternary conditional) | 从右向左 |
13 | = | 赋值 | |
+= -= | 按和差赋值 | ||
*= /= %= | 按乘积,商,余赋值 | ||
<<= >>= | 按左,右位移赋值 | ||
&= ^= ` | =` | 按位 与或非赋值 | |
14 | , | 逗号 | 从左向右 |
流程控制 [2]
C语言中提供了两种流程控制(flow control)
- Branching
- Looping
Branching
分支 (Branching) 将决定采取什么动作,循环将决定采取某种行动的次数。
if
形态1:
|
|
形态2:
|
|
形态3:
|
|
三元运算
<value1> ? <value2> : <value3>
是三元运算符,因为它需要三个值,这是 C 中唯一的三元运算符。语法
|
|
switch
|
|
break 关键字用作退出 switch 语句。在 switch case 中满足条件,则执行继续到下一个 case 子句,如果没有明确指定执行应该退出 switch 语句。
default 关键字用于在所有case中都不满足条件,则执行default
case穿透:case分支中如果,没有 break;那么它会向下继续执行下一个case分支.
if VS switch
- 检查表达式:if-else 可以基于值或条件检查表达式,而 switch 语句仅基于字符表达式或整数类型检查表达式。
- 运行速度:在大量条件检查中进行选择,switch 语句的运行速度将比使用 if-else 的逻辑快得多。
- 适合条件不同:if-else 适合导致布尔值的可变条件,而 switch 适合固定值。
- 可读性:if-else较switch-case语句可读性较差
Looping
循环 (Looping) 提供了一种重复命令和控制重复次数的方法。
while
while 是 c 语言中最基础的循环,while将检查expression,直到expression为false将推出循环
|
|
for
for是类似与while的循环,只是语法上不同,for提供了三个表达式
|
|
- expression1 - 通常用于初始化变量(在此初始化的变量作用域仅为该循环中)
- expression2 - 条件表达式,只要该表达式为true则循环将一直被执行
- expression3 - 修饰符,通常用于变量的自增自减操作
- 三个表达式都可以为空,这种场景下循环将一直进行
do…while
类似与while ,只不过do..while循环,在循环结束开始检查测试条件。这意味着循环的内容将==至少执行一次==。
|
|
break VS continue
C语言提供了两个命令来控制循环:
- break,退出循环或switch
- continue,跳过当前迭代 (iteration),继续循环
|
|
输出结果将没有第五次迭代
|
|
goto
goto 声明在C语言中提供了了一个无条件跳转到goto label出的
|
|
下面例子中,将从10开始执行,跳过15继续从16开始到20结束。
|
|
Reference
[1] printf format