常用技巧;¶
结构体排序¶
typedef struct {
int v1;
int v2;
int w;
}edge;
int cmp(const void *a,const void *b){
return (*(edge*)a).w - (*(edge*)b).w;
}
edge *edges = (edges*)malloc(sizeof(edge)*n);
qsort(edges,n,sizeof(edge),cmp);
varible function¶
stdio.h¶
printf %d[flags][width][.prec][hil]type
¶
返回值:输出的字符数
flag:
- - 左对齐
- + 在前边放+ 或 -
- (space) 正数留空
- 0 0填充
wdith or prec:
- number 最小字符数
- * 下一个参数是字符数
printf("%*d",6,123);
即printf("%6d",123);
- .number 小数点后的位数
- .* 下一个参数是小数点后的位数
type:
printf("%dty%n",12345,&num);
printf("%d",num);
此时第二个printf中num大小,即为第一个printf输出字符的个数(7)
scanf: %[flag]type
¶
返回值:读入的项目数
flag:
- * 跳过
scanf("%*d%d",&num);
先跳过一个,再读一个,如果输入123 345 那么读入345
- 数字 最大字符数
- [...] 所允许的字符
- \(GPRMC,004319.00,
scanf("%*[^,],%[^,]",sTime)
那么\)GPRMC是逗号前的,都跳过,‘,’也跳过,只读到了004319.00
- \(GPRMC,004319.00,
math.h¶
double acos(double x);
double asin(double x);
double atan(double x);
double cos(double x);
double sin(double x);
double tan(double x);
double exp(double x);
double log(double x);
double log10(double x);
double pow(double x, double y); //x为底数,y为指数
double sqrt(double x);
double ceil(double x); 返回大于或等于x的最小的整数值
double fabs(double x);
double floor(double x); 返回小于或等于x的最大的整数值
string.h¶
strlen(const char *s);
返回s的字符串长度(不包含结尾的0)
-
比较函数
-
复制函数
-
连接函数
-
查找函数
-
寻找第二个字符的操作:
-
复制某个字符前的内容
stdlib.h¶
随机数
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int main()
{
srand(time(0));
int a = rand();
//a为随机数
}
int abs(int n); //绝对值
div_t div(int numer, int denom); //计算商和余,结果作为`div_t`的结构返回,这个结构包含成员`quot`和`rem`
long labs(long n); //类似于abs,但用于长整数
ldiv_t ldiv(long numer, long denom); //用于长整数
void *bsearch(const void *key, const void *base, size_t n, size_t size, int (*compar)(const void *, const void *));
void qsort(void *base, size_t n, size_t size, int (*compar)(const void *, const void *));
qsort详解
-
base
数组名,元素个数,数组元素所占字节(int,double),排序原则(递增,递减,奇偶交叉),在使用qsort前需要一个函数:#include<stdlib.h> int cmp(const void *a,const void *b) { return *(int*)a - *(int*)b; } //此时表示递增,若想递减只需将a,b换位 qsort(num,n,sizeof(int),cmp)
bsearch详解
-
key
指向要查找的元素的指针,base
数组名,元素个数,数组元素所占字节(int,double),比较原则,如果查找成功,该函数返回一个指向数组中匹配元素的指针,否则返回空指针 -
文本转换
double atof(const char *str); //将字符串转换为双进度浮点数 int atoi(const char *str); //将字符串转化为整数,字符串中必须要有终止符 long atol(const char *str); //转化为长整数 double strtod(const char *str, char **endptr); long strtol(const char *str, char **endptr, int base); //base 基数,必须介于 2 和 36(包含)之间,或者是特殊值 0。如果 base 为 0,则会根据字符串的前缀来判断进制:如果字符串以 '0x' 或 '0X' 开头,则将其视为十六进制;如果字符串以 '0' 开头,则将其视为八进制;否则将其视为十进制。base 为10时,即为十进制 unsigned long strtoul(const char *str, char **endptr, int base);
strtod的实例:
-
内存管理
void *calloc(size_t nobj, size_t size); void free(void *ptr); void *malloc(size_t size); void *realloc(void *ptr, size_t size);
-
malloc(动态内存)free()
- 返回的结果是void* ,需要类型转换为所需的
- (int)malloc(nsizeof(int))
- 最后需要free
- 申请失败则返回0,或者叫做NULL
- free()将申请的来的空间还给系统
-
calloc与malloc的区别是,calloc会将分配的内存初始化为0
-
realloc尝试调整之前用malloc或calloc所分配的ptr所指向的内存大小。
-
ctype.h¶
字符判断函数
int isalnum(int c) //检查所传字符是否是字母和数字,否则返回0
int isalpha(int c) //字母
int isdigit(int c) //数字
int islower(int c) //小写
int isupper(int c) //大写
int isspace(int c) //空白字符,判断空格,水平制表符\t,换行符\n,回车符\r,换页符\f,垂直制表符\v
int isblank(int c) //空格字符,仅判断空格,水平制表符\t
字符转换函数
int tolower(int c)
int toupper(int c)