C语言易错点及难点

  1. 获得字符串长度:strlen(s),需要头文件#include<string.h>

  2. 判断两个字符是否相等用==

  3. 判断两个字符串相等:

    if(strcmp(s1,s2)==0),strcmp(s1,s2)
    

    相等返回0

  4. 想要输入带空格用gets(s)

  5. 头文件stdlib.h中的方法atoi可以实现字符串转数字"996"转为996

  6. #include<stdio.h>
    
    int main(){
    
    	int a=3;
    
    	printf("%d,%d",a++,--a);
    
    }
    	结果2,3
        C语言右结合性,先执行--a,再执行a++
    
  7. do while语句先执行在判断

  8. 在ASCII表中A和a相差32

  9. 多个数字调用函数,且没有接收值时,如fun(a,b,c),需要用指针来改变大小改为fun(&a,&b,&c)

  10. 数组调用函数可以直接改变大小也不需要接收值fun(a),a为数组

  11. int x=10;
    
    	printf("%d,%d\n",x--,--x);
    
    	printf("%d",x);
    //输出9,8
    

    在switch(i++)先判断switch(i),再++

  12. #include <stdio.h> 
    func(int a,int b) 
    { int c ;
    c=a+b;
    return(c);
    } 
    main() 
    { int x=6,y=7,z=8,r;
    r=func((x--,y++,x+y),z--);
    printf("%d\n",r) ;
    }//输出21
    

    调用函数时fun(a++),传的参数是a的值,不是a+1的值。

  13. Strcpy复制函数,将原字符串覆盖

  14. Strcat连接函数,在字符串后面连接

  15. int a[]={1,7,9,9,11,34}; 
    
    f(a+1);
    表示传的参数从第二个元素开始即 7,9,9,11,34
    
  16. str2[3][5]={"defg","hi\0j","klm"}; 
    
    Puts(str2[1])
        即输出hi
        字符串读取时若遇到人为赋值’\0’后面的都不进行读取
    
  17. char a[4][10] = {"1234", "abcd", "xyz", "ijkm"}; 
    
    int i = 3; 
    
    char (*p)[10]; 
    
    for (p = a; p < a + 4; p++, i--) 
    
    printf("%c", *((*p) + i)); 
    

    *p表示a[0][0]的地址**p表示a[0][0]

    p+1表示a[0][1]的地址,(*p+1)表示a[0][1]

    *p++表示a[1][0]的地址

  18. unsigned将数字型有符号类转换成无符号类,如int范围 -231~231-1转换为0~2^32

  19. int x=10;
    
    int y=10;
    
    printf("%d,%d\n",x--,--y);
    
    输出10,9
    
  20. #include <stdio.h> 
    int main() {
    	int x=0x02ff,y=0x0ff00 ; 
    	printf("%d\n",(x&y)>>4|0x005f);
    }
    

    0x表示16进制,0表示8进制,>>表示右移

  21. printf("%d\n",(0,0));
    printf("%d\n",(0,1));
    printf("%d\n",(1,0));
    printf("%d\n",(1,1));
    

    逗号表达式的结果是用逗号分开的最后一个表达式的 值

  22. 取反运算:a=-(a+1)即5=-6

  23. #include <stdio.h> 
    int main() {
    	int a=111 ;
    	a=a^00;//若a是整型变量,则a^00表示变量a与八进制数0进行“异或”运算。因为“异或”是按位进行的,相同为0,相异为1,所以a^00的结果是什么意义都没有,a还是a。若a不是整型变量,则a^00是非法操作,编译都过不了
    	printf("%d,%o\n",a,a) ;//%o表示以8进制输出,%x表示以16进制小写字母输出,%X表示以16进制大写字母输出
    }
    
  24. printf("%*c%.*s\n",3,' ',4,"*************");
    等价于printf("%3c%.4s\n",' ',"*************");//%.4s截取字符串长度为4
    输出3个空格4*
        
    #include <stdio.h> 
    int main() {
    char s[12]= "a book" ;
    printf("%50.4s",s) ;
    }
    总长度为50,字符为4;即46个空格+4个字符(a bo)
    

    在输出格式描述 “%m.ns” 中,m 是输出总长度, n 是实际字符的个数, 这里 m 没有给出,则输出总长度就是实际输 出字符的个数。

  25. #include <stdio.h> 
    int main() {
     int a,b ;
    scanf("%2d%3d",&a,&b) ;
    printf("a=%d b=%d\n",a,b) ;
    }
    输入1234567890
    输出a=12 b=345
    
  26. fabs(a)取绝对值函数

  27. #include <stdio.h> 
    int main() {
    	int x=2;
    	int a[2];
    	a[1]=(x++,x+3,x+7);
    	printf("%d",a[1]);
    }
    //a[1]=10
    //若a[1]=x++,x+3,x+7,则相当于a[1]=x;x++;x+3;x+7;
    

    逗号运算符从左开始运算,结果只保留最后一个,并赋值。

  28. #include <stdio.h> 
    void fun(int *s) {
    	static int j=0 ;//只运行一次
    	do {
    		s[j]+=s[j+1] ;
    	}while(++j<2) ;
    } 
    int main() { 
    	int k,a[10]={1,2,3,4,5} ;
    	for(k=1 ;k<3; k++) 
    		fun(a);
    	for(k=0;k<5; k++) 
    		printf("%d",a[k]) ;
    }
    //输出35745
    

    static在函数结束前只运行一次

  29. #include <stdio.h> 
    void num() 
    { extern int x,y;
    int a=15,b=10 ;
    x=a-b;
    y=a+b;
    } 
    int x,y ;
    int main() 
    { int a=7,b=5 ;
    x=a-b;
    y=a+b;
    num();
    printf("%d,%d\n",x,y) ;
    }//输出5,25,main 函数和 num 函数中都说明了变量 a 和 b,由于它们是内部变量,所以它们分别在说明它们的函数内有效。外部变量 x 和 y 在函数 num 之后被说明,而在 num 函数中又要引用它们, 所以在 num 函数中用关键字 "extern"说明变量 x和 y 是一个外部变量,也就是通知计算机这两个变量在 fun函数以外被说明,此处不是定义两个 int 型变量。
    
  30. #include <stdio.h> 
    int main(){
    	int a=3,b=4;
    	int c=(a++)*(b++);
    	printf("%d",c);
    }//输出12
    
  31. #include<stdio.h>
    int main() { 
    	int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12} ;
    	int *p=a[0];
    	p+=6;
    	printf("%d ",*p) ; /* ① */ 
    	printf("%d ",*(*(a+6))) ; /* ② */ 
    	printf("%d ",*(a[1]+=2)); /* ③ */ 
    	printf("%d",*(&a[0][0]+6)) ;/* ④ */ 
    }
    A) 7 7 7 7 B) ②句语法错误 C) ③句语法错误 D) ④句语法错误
    //②句没有语法错误,但是 a+6 指向数组之外,因为 a是 a[0]的地址, a+1 是 a[1]的地址, a+2 是 a[2]的地址,显然数组 a 没有 a[6]分量。③句错误,因为 a[1]是地址常量,它是 a[1][0] 的地址,对于地址常量是不可以进行赋值运算的。
    正确代码:
    #include<stdio.h>
    int main() { 
    	int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12} ;
    	int *p=a[0];
    	p+=6;
    	printf("%d ",*p) ;
    	printf("%d ",*(a[0]+6)) ;
    	printf("%d ",*(a[1]+2)); 
    	printf("%d",*(&a[0][0]+6)) ;
    }
    
  32. #include <stdio.h> 
    int main(){
    	int a=1;
    	int *p=&a;
    	a++;
    	printf("%d %d",a,*p);
    }//输出2 2
    

    p始终指向a的地址,a的值变化,地址不变。

  33. #include <stdio.h> 
    char *pp[2][3]={ "abc", "defgh", "ijkl", "mnopqr", "stuvw", "xyz"} ;
    int main () { 
    	printf("%c\n",***(pp+1)) ; /* ① */ 
    	printf("%c\n",**pp[0]) ; /* ② */ 
    	printf("%c\n",(*(*(pp+1)+1))[4]) ; /* ③ */ 
    	printf("%c\n",*(pp[1][2]+2)) ; /* ④ */ 
    	printf("%s\n",**(pp+1)) ; /* ⑤ */ 
    }
    ① A) a B) d C) i D) m 
    ② A) a B) d C) i D) m 
    ③ A) h B) l C) q D) w 
    ④ A) k B) o C) u D) z 
    ⑤ A) ijkl B) mnopqr C) stuvw D) xyz
    //DADDB
    
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值