1,较大数组应该在main函数外声明,否则可能因为
他作为临时变量在堆栈段中占据的空间过大,栈溢出
2,string.h
memcpy(b,a,sizeof(int)*k);//a->b 复制k个元素
memcpy(b,a,sizeof(a));//a->b
memset(a,0,sizeof(a));//将数组全部填充为零
3,在做某一个动作之前要考虑能不能做,因为悔棋
有时候不允许
4,
char s[18];
strlen(s);//得到的是结束符'\0'之前的字符数
//和sizeof(s)得到的空间大小不是一回事
5,strcat(),strcmp(),strcpy()连接,比较,复制
6,scanf("%s",s);//遇到tab,或是空格时就会停下
fgetc(fin);//返回一个整数,当到达文档尾,返回EOF
getchar() 等价于 fgetc(stdin);
7,换行
\r\n windows
\n linux
\r Macos
8,fgets(buf,maxn,fin);//读取一行,没有字符就返回NULL
while((c=getchar())!=EOF){
//循环读取得到字符
}
9,查表常量数组
10,ctype.h
isalpha() isdigit() isprint()
toupper()//变大写
tolower()//变小写
11,unsigned int 最大约为肆拾亿(32位)
12,typedef struct{ 定义内容;}类型名;
13,简化中间的表达式,考虑中间变量越界的问题
14,is_xxx() 是什么吗?0表示否定
15,sizeof(a)
当数组a作为参数传递进入函数时,得到的是4(指针长度)
只有当a的定义和 sizeof(a)在同一个函数中的时候,才是数组空间大小
16,素数判定
is_prime(int n){
if(n<=1) return 0;
int m=floor(sqrt(n)+0.5);
//使用m是为了减少每次调用sqrt()
//加上0.5,是为了避免xxx.9999被割掉小数部分
for(int i=0;i<=m;i++){
if(n%i==0) return 0;
}
return 1;
}
17, 交换函数
void swap(int *a,int *b){
int t=*a;
*a=*b;
*b=t;
}
18,访问数组的两种方式
int sum(int a[],size_t len);
int sum(int *begin,int *end);
//其中len=end-begin
19,stdlib.h
void qsort(void *base,
size_t num,
size_t size,
int (*compare)(const void *,const void *));
//从base开始对num个元素排序,size=sizeof(单个元素)
int compare(const void *a,const void *b){
return *(*int)a-*(*b);//先强制类型转换,然后解引,最后做差
}
20, 在运行时,程序会动态建立一个堆栈段,里面存放着堆栈段,
保存有临时变量和函数的调用关系,因此当递归的层数过多会发生段错误
(越界访问)、栈溢出。