c易错代码总结和零碎知识点

1.在输出浮点数时有相关的运算时,应特别注意除法中是否为包含小数位。

​ 如:5/9=0应该是浮点数应改为5.0/9.0

​ 如:5/9=0应该是浮点数应改为5.0/9.0

2.引用函数时所包含的语句一般为一句,多句应该加上大括号

3.是否有返回值,容易遗忘

​ 如:return 0;        

4.在printf中%m.nf,m表示指定数据的输出宽度(包括符号位喝小数点),n表示输出浮点型数据时保留n位小数

​ 如:%6.2f

5.变量在进行运算时,判断是否需要赋予初始值

​ 如:product=product*i;(double product=1)

6.对于if语句小括号里面的关系表达式易错点:

​ 如:if(1<=n<=10)

这并不是数学上的[1,10]的意思,这实际是一个运算符的优先级的问题,很容易出错,

无论你填什么进去他都是成立的。(可以运用逻辑运算符来解决:&&,||,!)

​ 可以改为:if((1<=n)&&(n<=10)).

应为逻辑运算符的优先级小于关系运算符,所以可以把括号去掉变成:

​ if(1<=n && n<=10)

7.在switch中case后面跟的是:而不是;,这个容易出错.

8.%d%c%d,&a,&op,&b中容易把其中的位置放错而出错.

8.再一次犯:

​ if(flag=0)--> if(flag==0)

10.switch语句中最后一个default之前容易漏掉一个break,从而导致多输出一段;

11.对于调用函数,引用时要注意把它的实参和形参都要一起移动,容易忘记形参的书写导致调用

​ 失败而没用反应;

12.检查程序错误需要细心和充足的耐心,沉得住气,

13.重点:scanf(“%d”,&&&&&&&yournumber);(多次漏掉!!!花了这么久,都没搞出来!!!)

14.函数调用的返回类型是什么类型的,要注意:

void sum(int i) /*函数的调用是没有返回类型的,如果是int,那就是返回整型类型的,如果不是会发生强势转化*/

15.函数调用是传值,每个函数之间的变量是单独的。

16.易错的一个会导致出现乱码:

double a;
scanf("%f",a); /*要注意这里是%f而不是%d,易出错*/

内容:

17.定义变量的生命周期和作用域(只在块内,块:就是在大括号里面;)

if(a<b)
{
    int i;  /*i的作用域取决与if里的条件,生命周期也是在这个块里面*/
}

18.int main中的return 0;是有意义的也是有必要的,电脑里面的操作系统可能会需要;

19.scanf漏&;

20.printf多&;(真不错)

21.if(是一个关系表达式);里面的有等号的话是==;

22.函数调用在返回主函数时是否有变量接受他的返回值,易出错;、

(局部变量)

/*且这里没有变量接受调用函数的返回值*/**</u>

fun(int a, int b, int c)
{
    c = a * b;
}
int main(void)
{
    int c;
    fun(2, 3, c);       /*且这里没有变量接受调用函数的返回值*/
    printf("%d\n", c);
    return 0;
}
A.0
​
B.1
​
C.6
​
D.无法确定
​
​
答:D

但是不影响 main() 中变量 c 的值。main() 中的打印变量 c 的值,还是最初系统分配的那个随机值。

23.考察全局变量和局部变量的关系,根据 C 语言的规则,当一个函数中,局部变量和全局变量名相同的时候,那么函数中操作的是局部变量,所以打印的是 main() 里面定义的局部变量 x 的值为 3,而 y,在main() 没有定义,那么自然就是全局变量 y 值为 7。

**/*且这里没有变量接受调用函数的返回值*/******

nt x = 5, y = 6;
void incxy()
{
    x++;
    y++;
}
int main(void)
{
    int x = 3;
    incxy();    /*且这里没有变量接受调用函数的返回值*/
    printf("%d,%d\n", x, y);
    return 0;
}
A.3,6
​
B.4,7
​
C.3,7
​
D.6,7
​
​
​
答:C

24.在for循环中,最后一个i++会增加后再判断是否符合条件,易错!

25.认真仔细观察printf中所包含的内容不要遗

26.ox表示整数,如0x123,十六进制的数 /x表示字符,如/41为字符‘A’;

27.~取反,^异或(相同为假,异或为真);

28.sizeof(int)的值为2,说明有两个字节,一个字节有八位二进制位;即最大值位2^15-1;

29.按照原码,反码,补码的规则,整数的原码,反码,补码都相同,即符号位是0,其余各位表示数值。负数的原码:符号位是1,其余各位表示是数值的绝对值。反码:符号位是1,其余各位原码取反。补码:反码加1。

(注):负数的值比正数多1;

如:2个字节的范围:[2^15,2^15-1];

30.用min来保存数组a[i]的最小值更容易理解,但是需要多设置一个变量用来记录其下标,直接设下标会更加便利,因为设置下标既可以表示下标也可以表示相对应的数组量。

/*找出数组的最小值和它对应的最小下标*/
#include<stdio.h>
​
int main()
{
    int i,n,min,sub;/*用min来保存数组a[i]的最小值更容易理解,但是需要多设置一个变量用来记录其下标,直接设下标会更加便利*/
    int a[10];
    
    printf("输入n的值:");
    scanf("%d",&n);
    printf("输入%d个数字:",n);
    for(i=0;i<n;i++)
    {
        scanf("%d",&a[i]);
    }
    if(n>=1 && n<=10)
    {
        min=a[0];   /*min用来保存最小值*/
        sub=0;      /*sub为最小值的下标*/
        for(i=1;i<n;i++)
        {
            if(a[i]<min)
            {
                min=a[i];
                sub=i;  
            }   
        }   
    printf("最小值是:%d\t下标为:%d\n",min,sub);
    }
    else
    {
        printf("无效输入,请重新输入n的值!\n");
    }
    
    return 0;
}
/*找出数组的最小值和它对应的最小下标*/
#include<stdio.h>
​
int main()
{
    int i,n,index=0;
    int a[10];
    
    printf("输入n的值:");
    scanf("%d",&n);
    printf("输入%d个数字:",n);
    for(i=0;i<n;i++)
    {
        scanf("%d",&a[i]);
    }
    if(n>=1 && n<=10)
    {
        for(i=1;i<n;i++)
        {
            if(a[i]<a[index])
            {
                index=i;    
            }   
        }   
    printf("最小值是:%d\t下标为:%d\n",a[index],index);
    }
    else
    {
        printf("无效输入,请重新输入n的值!\n");
    }
    
    return 0;
}

31.数组的定义和数组元素的引用

定义数组是方括号里不能用变量来代表数长度,即使变量在先前已经赋值,因为数组的长度为不可变值,变量虽然初始化赋值,但有可能会改变,故不允许变量来定义长度。

但是数组元素的引用可以用变量来表示。

注:不能让数组下标越界,有可能造成不可预料的运行结果。

但是可以定义宏定义来表示。

32.注意换行时要注意的地方,应该是在同一个if里面,在外面就会出错

如:

while(i<200)
    {
        if((i%7==0&&i%2==0)||(i%17==0&&i%2==0))
        {
            printf("%6d",i);
            count++;
            sum=sum+i;
            if(count%5==0)
            {
                printf("\n");
            }
        }
        i++;
    }

33.pirntf中换行可以放到句子的前面

如:

printf("\nsum=%d");

34.要注意中间变量的使用:如:temp来防止改变前后不能改变的量

#include<stdio.h>
int main()
{
    int n,i;                    /*且要注意a,b,c应该为实型*/
    double item=2.0,sum=0,a=2.0,b=1.0,temp; /*a为分子,b为分母,c为中间变量*/
                                            
    scanf("%d",&n);
    
    for(i=1;i<=n;i++)
    {
        sum=sum+item;
        temp=a;
        a=a+b;
        b=temp;
        item=a/b;
    }
    printf("s=%.2f",sum);
    
    return 0;
}

35.(1)要特别注意有相除的时候要特别留意是否需要double型 来,易出错。

​ (2)还有这里的x是不能变的要细心观察是否前后的量改变

#include<stdio.h>
#include<math.h>
​
double fact(int n)
{
    int i;
    double result;
    
    result=1;
    for(i=1;i<=n;i++)
    {
        result=result*i;
    }
    return result;
}
​
int main()
{
    int i;
    double sum,item,x,b,a;
    
    scanf("%lf",&x);
    i=2;
    b=1;
    sum=0;
    item=x/b;
    while(fabs(item)>=0.00001)
    {
        sum=sum+item;
        a=pow(x,i);     /*此处不能用x来代替a*/
        b=fact(i);
        item=a/b;
        i++;
    }
    printf("s=%.2f",sum);
    
    return 0;
}

36.二分查找法

优点:当一个数组元素量很大时,效率高;

缺点:前提时素组元素必须是有序。

可以利用选择排序和冒泡排序等排序方法一起并用,先排序在利用二分查找,但是这样排序时所需要的空间和时间又会增加,还需具体情况具体使用。

37.顺序查找法

优点:简单明了;

缺点:从头到尾进行遍历,一旦数组元素量很大,效率就不高。

38.另外,如果在给数组赋值时,把每个字符单独用引号括起来。也会丢失'\0'。

如: u8 str1[]={'c','x','j','r','.','2','1','i','c','.','o','r','g'};

如果希望数组以'\0'结束,则要么写成: u8 str1[]={"cxjr.21ic.org"};

要么写成(人工添加'\0'): u8 str1[]={'c','x','j','r','.','2','1','i','c','.','o','r','g','\0'};

要么写成(故意给数组预留一个空位): u8 str1[14]={'c','x','j','r','.','2','1','i','c','.','o','r','g'};

.输出几年几月几日的程序中for循环条件yearday>tableap中yearday打错成了year。

39.指针计算两个数的和与差中double的输入和输出格式出错导致出错。

40.作为实参传给指针时,没有传到地址过去;/实数拆分/

41.数组下标的处理不够细节,导致了数组下标越界!(分治法求a[m]~a[n]中最大最小的递归函数)

xxxxxxxxxx /用二级指针指向二维数组来比较字符串长度/#include<stdio.h>#include<string.h>int main(){ int n,i,j; char temp[30]; char str20; scanf("%d",&n);// getchar(); /特别注意:这里的回车会被gets中读取,会少一次输入,导致出错!!!/ for( i=0; i<n; i++ ) { scanf("%s",str[i]); /如果用scanf到不用getchar()/ // gets(str[i]); } for( i=1; i<n; i++ ) { for( j=0; j<n-i; j++ ) { if( strlen(str[j])>strlen(str[j+1]) ) { strcpy(temp,str[j]); strcpy(str[j],str[j+1]); strcpy(str[j+1],temp); } } } printf("Sorted result:\n"); for( i=0; i<n; i++ ) { printf("%s\n",str[i]); } return 0; }

42.stray ’\241‘in programe; : 源程序中有非法字符;(在其他空白地方打错了或打多了,检查一遍);

43.单链表中注意删除后的长度变化,在循环中容易忽略,应用LIstLength来计算表长来控制循环;

44.双指针的运用遗漏:在使用malloc函数申请空间时,接收的指针忘记*号;

  1. (L)->next=NULL; /链尾标记NULL*/

    错误的写成了(L)->next==NULL;导致了后面的出错;

    调试中出现:program received signal sigsegv,Segmentation fault;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值