scanf标准输入函数,从终端中输入。
printf标准输出函数,从终端中输出。
文件描述符stdin标准输入,
文件描述符stdout标准输出。
文件描述符EOF(看不见)文件末尾。
----------------------------------------------
sprintf(字符数组首地址, format, ...):将标准输出打印到字符串(字符数组)中
return成功打印字符的数量
sprintf常用于字符串拼接:
sscanf(str, "%d%d" , ...); 字符串的分割
char str[100] = {0};
int arr[4] = {0};
sprintf(str, "%d.%d.%d.%d", 192, 168, 1, 1);
printf("%s\n", str); // str的内容为192.168.1.1
// 字符串分割
sscanf(str, "%d.%d.%d.%d", &arr[0], &arr[1], &arr[2], &arr[3])
//FILE类型
FILE *fp = fopen("相对路径or绝对路径", "w+r+");
w+ : 如果当前文件不存在,w+可建立新文件
w: 覆盖写
a+ : 追加写
r+
b等等。
fprintf(文件(指针类型), format, ...):将标准输出打印到 文件 中
return成功打印字符的数量
fprintf(fp, "%s\n", str);
sprintf(文件(指针类型), format, ...):从文件中进行标准输入。
%c法:
// fscanf()读入文件全部并打印
FILE *fp = fopen("./output", "r+");
char temp[100] = {};
int k = 0;
while (~fscanf(fp, "%c", &temp[k++]));
printf("%s\n", temp);
fclose(fp);
%s法(推荐):
// fscanf()读入文件全部并打印
FILE *fp = fopen("./output", "r+");
char temp[100][100] = {};
int k = 0;
while (~fscanf(fp, "%[^\n]s", temp[k++])) {
fgetc(fp);
}
for (int i = 0; i < k; i++) {
printf("%s\n", temp[i]);
}
fclose(fp);
----------------------------------------------
数学运算:
=
+ - * / ( )
%
& | ^ ~
<< >>
二进制运算:
^异或,相同为0,不同为1.
逆运算:要满足交换律。
比如减法是加法的逆运算,但是加法不是减法逆运算。
因为a + b = b + a,但a - b != b - a
异或运算本身与自己就是逆运算。
a ^ b = c
c ^ b = a
c ^ a = b
a ^ a = 0; // 相同为0
0 ^ b = b; // 不同为1
面试题:
若干的数字,其中只有一个数只出现1次,其他都出现了2次,问如何快速找到?
如 2 3 2 3 1,所有运算之间异或:
2^3^2^3^1 = 2^2^3^3^1
= 0 ^ 0 ^ 1
= 1
(满足交换率)
~按位取反:
如: 0 -> 0b00000000
~0 = -1 -> 0b11111111
左移 << 左移1位相当乘2
右移 >> 右移1位相当除2
空的补符号位
循环读入:
while (~scanf("%d", &n)){
}
因为~0 = -1(EOF)
二进制补码表示负数:
补码=反码 + 1
反码=~原码
负数=~原码 + 1
方便记忆:
竖式运算0-1得到-1
00000000
-00000001
----------------
111111111