PAT C语言基础知识
虽然说都知道,但是有些东西还是不清晰。在这里写一写,日后慢慢更新。
变量相关
- 变量的第一个字符:字母或下划线,其他字符:字母,下划线,数字。
- int整型范围:32位(32位整数,10^9以内),-2^31~~+2^31-1。绝对值在10^9以内的都可以定义成int。
long long范围:(64位整数,10^18以内)2的63次方。超过2147483647的就要用long long。后面要加LL标识符。 - 浮点型:遇见浮点型直接用double就可以,float精度低不必考虑。%lf输入,%f输出。
- 字符型:记住几个ASCII码:'0'->48; 'A'->65; 'a'->97;
小写字母比大写字母大32; - 开 char s[] 字符数组的时候一定要多申请一个来存放 '\0' 结束标志。
比如存10个char的动态数组:char* s = (char*) malloc(sizeof(char)*11)应该是这样吧
函数相关
- 关于scanf():
long long n; scanf("%lld",&n); double n; scanf("%lf",&n); //double的输入占位符是%lf scanf("%c",&c); //是可以读入空格字符的,因为是%c
- printf():
double n; print("%f",n); double的输出占位符是%f
%2d、%02d、%.2f:超出的会直接输出而并不是格式化的2位 -
四舍五入,返回double型变量,需要强转取整一下。round(double x)
-
为数组中的元素按字节赋值。需要包括string.h。只建议初学者赋值0或-1,因为涉及到补码问题。memset(数组名,值,sizeof(数组名))
- 只有scanf和gets会在字符数组最后加 '\0' 结束标志,其他的(比如getchar)不会添加需要手动加。
- string.h中常用函数
#include<string.h> int strlen(字符数组); \\得到字符数组中'\0'前的字符的个数 例如:"memeda\0muadarling"得到的长度是6 int strcmp(字符数组1,字符数组2); \\字符串比较大小,比较字典序,a<b,无关长度 返回值: s1<s2,返回负整数; s1==s2,返回0; s1>s2,返回正整数 strcpy(字符数组1,字符数组2); \\字符串复制,2复制给1 strcat(字符数组1,字符数组2); \\字符串连接,2连到1后面
- sscanf()与sprintf()
int n = 223; char str[100] = 123; sscanf(str,"%d",&n); 从左到右,将str以%d形式输入到n里,n=123 sprintf(str,"%d",n); 从右到左,将n以%d形式输入到str里,str=223
- qsort()排序函数
引用自大佬博客:https://blog.csdn.net/zhaozicang/article/details/24174965快速排序是一种用的最多的排序算法,在C语言的标准库中也有快速排序的函数,下面说一下详细用法。
qsort函数包含在<stdlib.h>中
qsort函数声明如下:
void qsort(void * base,size_t nmemb,size_t size ,int(*compar)(const void *,const void *));
参数说明:
base,要排序的数组
nmemb,数组中元素的数目
size,每个数组元素占用的内存空间,可使用sizeof函数获得
compar,指向函数的指针也即函数指针。这个函数用来比较两个数组元素,第一个参数大于,等于,小于第二个参数时,分别显示正值,零,负值。
下面看几个例子:
#include<stdio.h> #include<stdlib.h> #include<math.h> #include<string.h> void main(void) { int i; int a[10]={0,1,2,3,4,5,6,7,8,9}; char b[10]={'a','b','c','d','e','f','g','h','i','j'}; double c[10]={0.1,0.2,0.9,0.5,0.3,0.6,0.7,0.8,1.1,1.2}; int cmp1(const void * a,const void * b) { return (*(int*)a-*(int*)b);//a>b 返回正值 } int cmp2(const void * a,const void *b) { return(*(char*)a-*(char*)b); } int cmp3(const void * a,const void * b) { if(fabs(*(double*)a-*(double *)b)<1*exp(-20)) return 0; else return(((*(double*)a-*(double*)b)>0)?1:-1); } qsort(a,10,sizeof(int),&cmp1);//对于函数指针(指向函数的指针),直接传入函数名和函数名进行& //运算都是可以的,因为在调用函数时也是取的函数的地址 qsort(b,10,sizeof(char),cmp2); qsort(c,10,sizeof(double),cmp3); for(i=0;i<10;i++) printf("%d ",a[i]); for(i=0;i<10;i++) printf("%c ",b[i]); for(i=0;i<10;i++) printf("%lf ",c[i]); }
为啥用Chrome窄窗口写完CSDN还错版了呢。。。这么不行的么