C基础系列(一)

这里做一些C语言的语法的总结。

1.输出数字类型

printf("%d\n",2);

2.保留小数点后一位,示例为1 不是 L

printf("%.1f\n",8.0/5.0);

3.整数值用 %d,实数用 %f 输出。

4.开平方,需要引入 #include<math.h>

sqrt(3)

5.scanf中的占位符和变量的数据类型应一一对应,且每个变量前都需要加&符号。

6.输入两个实数(含小数):这里是两个L,即为 lf , 这里要注意,输入实数采用的是 “%lf ” 而不会 “ %f ”

scanf("%lf%lf",&r,&h);

7.用const关键字声明常数

const double pi = acos(-1.0);

8.要把25输出为025,可以使用 %03d 即可。

printf("%03d\n", m);

9.在C99中,double的输出必须用 %f , 而输入需要用 %lf 

10. 怎么输出 \n , 可以 用“\\n”

11.怎么输出 %d , 可以用 “%%d”

12. 在定义变量时,最好尽量缩小变量定义的范围。

13. 浮点数的运算有可能存在误差。那么怎么避免呢?

为了减小误差的影响,一般改成四舍五入,即 floor(x+0.5)。

14. 浮点运算可能存在误差。在进行浮点数比较时,应考虑到浮点误差。

15. 在大多数平台中,int都是32位整数,范围是 -2147483648 ~ 2147483647 。要注意int类型溢出问题。

16. 要计算只包含加法,减法和乘法的整数表达式除以正整数n的余数,可以在每步计算之后对n取余,结果不变。

17. 可以使用time.h和clock()函数获得程序运行时间。常数CLOCKS_PER_SEC 和 操作系统,

请不要直接使用clock()的返回值,而应总是除以CLOCK_PER_SEC。

printf("Time used = %.2f\n", (double)clock()/CLOCKS_PER_SEC);

18.变量在未赋值之前的值是不确定的。

19. 使用文件最简单的方法是使用输入输出重定向

freopen("input.txt","r", stdin);
freopen("output.txt","w",stdout);

20.#ifdef 和 #endif 如果怎样就执行

#define LOCAL
...

int main()
{
   #ifdef LOCAL
     printf("test");
  #endif  
}

21.如果要求用文件输入输出,但是禁止使用重定向的方式,可以如下

#include<stdio.h>
#define INF 100000000
int main()
{
    FILE *fin,*fout;
    fin = fopen("data.in","rb");
    fout = fopen("data.out","wb");
    int x,n=0,min = INF,max=-INF,s=0;
    while(fscanf(fin,"%d",&x)==1){
        s += x;
        if(x<min) min=x;
        if(x>max) max = x;
        n++;
    }
    fprintf(fout,"%d %d %.3f\n",min,max,(double)s/n);
    fclose(fin);
    fclose(fout);
    return 0;
}

可以看出,先声明变量 fin 和 fout, 把 scanf 改成 fscanf ,第一个参数为 fin ; 

把 printf 改成 fprintf,第一个参数为 fout ,最后执行 fclose,关闭两个文件。

22.输出精确到小数点c为的实数。

printf("%.*lf\n",c,(double)a/(double)b);

而对下面用法,前面的*定义的是总的宽度,后面定义的是输出个数,分别对应外面的参数m,n

printf("%*.*s\n",m,n,ch);

23.一维数组定义

int a[maxn]

24.数组a可以被声明在main里面也可以在外面。只有在外面时,数组a才可以开的很大;放在main函数里面,数组稍大就会异常退出。

25. 数组不能够进行赋值操作,如果要从数组a复制k个元素到数组b,可以这样做:

memcpy(b,a,sizeof(int)*k)

当然,如果数组a和b是浮点型的,复制时要写成 

memcpy(b,a,sizeof(double)*k)

使用memcpy函数,需要包含头文件 string.h。

如果要把数组a全部复制到数组b中,可以这样

memcpy(b,a,sizeof(a))

26. 把数组清零

memset(a,0,sizeof(a));

27.二维数组

int a[maxn][maxn];

28. 读入一个不含空格、TAB和回车符的字符串,存入字符数组s

scanf("%s",s);

它遇到空白字符会停下来。

 29.把数字输入到字符数组中

sprintf(buf, "%d%d%d%d%d",abc,de,x,y,z);

30.判断buf中的指定位置的字符是否包含在字符数组s中,如果不包含则为NULL

if(strchr(s,buf[i])==NULL) ok = 0;

31.在一个字符串中查找单个字符: strchr 

32. strlen(s) 返回的是结束标记之前的字符个数。

33. 由于字符串的本质是数组,它也不是一等公民,只能用strcpy(a,b),strcmp(a,b), strcat(a,b)来执行赋值,比较,和连接操作。

34. 对于由空格的字符串输入,可以使用 fgetc(fin), 它读取一个打开的文件 fin,读取一个字符,然后返回一个 int值。

如果要从标准输入读取一个字符,可以用getchar,它等价于 fgetc(stdin)。

第二种方法是使用 fgets(buf, maxn,fin) 读取完整的一行。

fgets(buf,maxn,fin) 将读取完整的一行放在字符数组 buf 中。应该保证 buf 能够存放下文件的一行内容。

fgets的标准输入版 gets , gets没有指明读取的最大字符数。

gets已经被废除了。

C语言中的 gets(s) 存在缓冲区溢出漏洞,不推荐使用。

while((c=getchar()) != EOF){
...
}

35. 常量数组

char s[] = "1234567890"

36.找字符在常量数组中的位置

while((c=getchar()) != EOF )
{
    for (i=1;s[i] && s[i] != c ; i++);
}

37. isalpha 判断字符是否是字母,类似的 isdigit , isprint 等,都是定义在头文件 ctype.h

而 toupper, tolower 等可以用来转换大小写。

posted @ 2020-05-28 23:57  Vincent-yuan  阅读(298)  评论(0编辑  收藏  举报