char(表示字符串)
C语言中没有string类型,直接用char定义字符串。字符常量用单引号,字符串常量用双引号。
#include<stdio.h>
int main(){
char str1[25] = "i am fine";
char str2[25] = "thank you";
printf("%s, %s!" , str1 , str2);
return 0;
}
运行结果:
bool
#include<stdio.h>
int main(){
bool flag1 = true; #c语言里没有bool类型,文件保存为cpp格式,可以直接使用,如保存为.c的后缀,则需要加一个头文件 #include<stdbool.h>
bool flag2 = 0;
int a = 1; int b = 1;
printf("flag1=%d,flag2=%d,(a==b)=%d",flag1,flag2,a==b);
return 0;
}
强制类型转换
只用在该变量之前加个括号,里面写上转换的类型就可以了。例如使用(double) a/(double)b来避免默认整除。
符号常量和const常量
符号常量就是用一个标识符来替换常量。又称为宏定义或者宏替换。
#define 标识符 常量
#define pi 3.14 //结尾没有分号
它也可以用在定义一些小函数上,但在调用时,它会把输入的变量原封不动的放进函数中去运算,可以导致错误,需要谨慎使用,实在要用的话,要多加括号。
建议定义常量的时候都使用const
const 数据类型 变量名 = 常量;
const double pi = 3.14;
const double pi = acos(-1.0) ; 这里得到的pi为精确解。
逻辑运算符
&& 与;|| 或;!非 (不要记错)
三目运算符
int c = a > b ? a : b; //找最大值
位运算符
<<左移(变大)如 (2<<30)-1等同于2^30-1 加括号的原因是为运算符的优先级比较低
>>右移(变小)
输入输出
double类型变量的输入是%1f,输出为%f
getchar() 能接受换行符
typedef
用来给一个复杂的数据类型取一个别名。
常用math函数
#include<math.h> (以下的x都是double类型)
(1)fabs(x) 对x取绝对值
(2)floor(x) 对x进行向下取整;ceil(x)对x进行向上取整
(3)pow(r,p) 返回 r^p
(4)sqrt(x) 返回x的算术平方根
(5)log(x)返回x以自然对数e为底的对数。若想用别的底,要用换底公式。
(6)sin(x) cos(x) tan(x) x参数要求是弧度制 即:度数*pi/180
(7)asin(x) acos(x) atan(x) 返回反函数值
(8)round(x) 将x进行四舍五入,返回的值也是double类型,要想得到整数还需要进行取整。
if
if(m != 0) 可以省略写为if(m)
if(m == 0) 可以省略写为if(!m)
switch
格式如下:要注意case后面的处理没有大括号,每个case结束要有break,case的值不用带括号。
while & do while &for
while别忘了i++;
do while 结束要带上分号
要保存为cpp格式文件,才能在A中定义临时变量的类型 如 int i =1
数组的赋值,输入和输出
二维数组的赋值,输入和输出
如果数组较大(大概是10^6级别),则需要将其定义在主函数外面,否则会使程序异常输出。
memset——对数组每个元素赋相同的值
使用前需要加上头文件 #include<string.h>
建议只在想赋值0 和-1的时候使用该函数,这时括号里的值就是0和-1。若赋其他值很可能出错。
字符数组
初始化
字符数组的初始化有两种方式,
第一种:
第二种:(这种赋值方式仅限于初始化,程序其他位置不允许这样直接赋值整个字符串)
输入输出
(1)scanf /printf :有两个格式来实现字符输出。%c会识别空格和换行进行输入。%s将空格和换行作为一个输入的结束。同时%s不同输入是不用加&。
(2)getchar()/ putchar():单个字符输入输出。会读入空格和换行符。
(3)gets/puts:一行字符串的输入输出,以\n作为输入结束。输出时会自己为每一行加上换行符。
gets和scanf输入字符串时会将\0自动添加在输入的字符串后面,并占有一个字节,而puts与printf就是通过识别\0作为字符串的结束来输出的。为了保存\0,开字符串数组时一定要至少比字符长度多一个。(只有char需要,int等其他类型不需要\0)
若不是使用这两输入方式,而是使用getchar来输入,就需要在每一个输入的字符串后面加上\0,否则用printf 和puts输出字符串会因无法识别字符串末尾而输出乱码。
string.h头文件
常用函数
sscanf 与sprintf
很高级的两个东西。
sscanf 从左边往右边赋值;sprintf 从右边往左边赋值。
上图是第一行是将str中的内容以%d的格式写入n中,将str中的数据写成“%d”的形式,在将其中的数据提取到n中;第二行是将n中的内容以%d的格式赋值到str中,就是把n放到中间这个“%d”的字符串中,再传给str。
以数组作为函数参数
指针
int* p; //p是一个指针变量,用来存放某个变量的地址
print(“%d\n”, *p); //*号相当于打开房间的钥匙,打开这个地址,就可以得到改地址里存放的内容。
*p = &a //可以用钥匙打开这个房间,对里面的内容进行修改。
指针与数组
int* p = a ;//数组名a可以作为数组a的首地址&a[0]被赋值给指针变量p
// a + i = &a[i] 地址等价
// *(a + i) = a[i] 值等价
scanf("%d", a + i) ; //很神奇的写法,和scanf("%d", &a[i])等价
for (int* p = a; p < a + 10; p++){ //指针变量可以进行自增操作,来枚举数组中的元素
printf("%d", *p);
}