格式化

printf:%[flags][width][.prec][hlL]type
scanf: %[flags]type
  • flags

     -:左对齐
    +:强制+
    0:0填充;

  • width

    number
    .number
    *
    .*

  • HlL

    hh char
    h short
    l long
    ll long long
    L long double

  • type

    i\d -> int
    g\G -> float
    u -> unsigned int
    o -> 八进制
    a\A -> 十六进制浮点
    x\X -> 十六进制\字母大写的十六进制
    c -> char
    s -> 字符串
    P -> 指针
    f\F -> float
    e\E -> 指数
    n -> 读入\写出的个数

1
2
3
4
5
6
7
8
int main(){
printf("%9d\n", 1234567890);
printf("%-9d\n", 1234567890);

int num;
printf("%-6d%n\n", 1234567890, &num);
printf("%d\n", num);
}

返回值

printf:读入的项目数
scanf:输出的字符数
1
2
3
4
5
6
7
int main(){
int num;
int a = scanf("%i", &num);
int b = printf("%d\n", num);
printf("%d:%d\n", a, b);
return 0;
}

FILE

fopen | fclose | fscanf | fprintf
1
2
3
4
5
6
7
8
9
FILE * fp = fopen("filePath""r");
// 判断 fp 是否为 NULL
if(fp){
int num;
fscanf(fp, "%d", &num);
fclose(fp);
}else{
printf("无法打开文件。\n");
}

fopen

r | r+ | w | w+ | a | ..x:只新建,如果文件存在,则不能打开

二进制文件

所有的文件最终都是二进制    

二进制读写

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//内存指针,内存大小,内存个数,文件指针
size_t fread(void *restrict ptr, size_t size, size_t nitems, FILE *restrict stream);
size_t fwrite(const void *restrict ptr, size_t size, size_t nitems, FILE *restrict stream);
//返回值:成功读取的字节数

//size 结构大小
//nitems 结构个数

//文件中定位
long ftell(FILE *stream);
int fseek(FILE *stream, long offset, int whence);

// whence
// SEEK_SET:从头开始
// SEEK_CUR:当前位置
// SEEK_END:从尾开始

二进制缺点

可移植性差

按位运算

&
|
~ :反
^ :异或(两个位不相等为1,相等为0)
<<:左移(乘以 2^n)
>>:右移(除以 2^n)
*移位不可以用负数*
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
0101 1010 & 5A
1000 1100 8c
//0000 1000 08

//常用场景
x & 0xFE
x & 0xFF

1010 1010 | AA
0101 0100 54
//1111 1110 FE

1010 1010 ~ AA
//0101 0101 55

1011 0100 ^
0100 1011
//1111 1111

1010 0101 <<2 A5
//1001 0100 94

位段

1
2
3
4
5
6
struct U0{
unsigned int leading :3;
unsigned int Flag1 : 1;
unsigned int Flag2 : 1;
int trailing : 11
}