C基础
1. 问题:pow(a,2)会报错:undefined reference to `pow'
原因:像 pow(2,3); 这种调用,gcc 在编译时就可以将其替换为对应的值(gcc 优化的一部分),从而不需要链接 pow 所在的数学库 libm;
而像 pow(a,2); 这种调用,一般无法做这种替换,因此需要链接 libm。
解决:加选项-lm
其他:
-lm:寻找libm.o这个库的某个函数的所有函数
函数库是由库函数构成,函数有时候要多个库支持
math并不是一个库而是函数,函数有时候要多个库支持,所以要用-lm的方法把所有库整合一起才能调用这个函数
2. printf()
1) 多进制转换 %d:十进制 %o:八进制 %x:十六进制 注:无二进制的表示方法 2) 占位宽、左右对齐 printf("%10d",a); //占10位,且右对齐 printf("%-10d",a); //占10位,且左对齐 3) 小数位数控制 a=3.14; //3.140000 printf("%.2f",a); //3.14 printf("%5.2f",a); //||3.14 注:占位小于实际位数: printf("%3.2f",a); //3.14 4) *号 - 代表任何整数 a=3.14,b=5,c=2; printf("%.*f\n",c,a); //3.14 , * = c printf("%*.*f\n",b,c,a);
3. 输入不定个数的一组数
1) malloc()
void* malloc(unsigned size);
在内存的动态存储区中分配一块长度为size字节的连续区域,参数size为需要内存空间的长度,
返回该区域的首地址.
2) realloc()
void* realloc(void* ptr, unsigned newsize);
给一个已经分配了地址的指针重新分配空间,参数ptr为原有的空间地址,newsize是重新申请的地址长度.
例: #include <stdio.h> void main() { int a,i=0,j; int *stack=(int *)malloc(1*sizeof(int)); while(scanf("%d",&a)!=EOF){ stack[i++]=a; stack=(int *)realloc(stack,sizeof(int)); } for(j=0;j<i;j++){ printf("%d ",stack[j]); } }