ACM新成员调试练习

C语言调试常见错误

 一、第一类错误分析

    1在使用变量前未定义。

      例如:

       main()

       a=1;

        b=2;

        printf(″dn″, a+b);

      

    2语句后面漏写分号或不该加分号的地方加了分号。

      C语言规定,语句必须以分号结束,分号是C语句不可缺少的一部分,这也是和其它高级语言不同的一点。初学者往往容易忽略这个分号。

     如:

      x=1

      y=2

     又如在复合语句中漏写最后一个语句的分号:

      t=x;

       x=y;

       y=t

     

    3不该有空格的地方加了空格

      例如,在用/*...*/对C程序中的任何部分作注释时,/与*之间都不应当有空格。

      又如,在关系运算符<=,=,==!=中,两个符号之间也不允许有空格。

   4定义或引用数组的方式不对。

      C语言规定,在对数组进行定义或对数组元素进行引用时必须要用方括号(对二维数组或多维数组的每一维数据都必须分别用方括号括起来),例如以下写法都将造成编译时出错:

       int a(10); int b5,4;

       printf(″dn″,

       b1+2,2);

    5混淆字符和字符串

      C语言中的字符常量是由一对单引号括起来的单个字符;而字符串常量是用一对双引号括起来的字符序列。字符常量存放在字符型变量中,而字符串常量只能存放在字符型数组中。例如,

      假设已说明num是字符型变量,则以下赋值语句是非法的:

       num=″1″;

   6在引用数组元素或指针变量之前没对其赋初值。

      例如:

      main()                  main()

      int a6,b;              {int *ptr, i=1;

       b=a5;                 *ptr=i

                            

                          }

     以上两个程序段在编译时均会出现警告信息。

   7混淆数组名与指针变量

      C语言中,数组名代表数组的首地址,它的值是一个常量,不能被修改。例如,在以下程序段中,用a++是不合法的。

       main()

       int i, a10;

        for (i=0;i10;i++)

        scanf(″d″, a++);

        

      

   8混淆不同类型的指针。

      若有以下语句:

      int *p1, a=1;

      float *p2;

      p1=&a;

      则赋值语句p2=p1是非法的。

   9混淆指针说明语句中的*号和执行语句中的*号。

      设有以下说明语句:

       int *p1, i=1;

       *p1=&i;是不合法的。

   10误将函数形参和函数中的局部变量一起定义。

      例如:

      fun(x,y)

      float x, y, z;

      x++; y++; z=x+y;

       

     

   11所调用的函数在调用前未定义。

      main()

      float a=10, b=20, c;

      c=fun(a,b);

      

     

      float fun(x, y)

      float x, y;

      x++; y++;

      

     

   12混淆结构体类型名和结构体变量名。

       若定义了以下结构体类型student

       struct student

       long int num;

        char name20;

        int age;

        float score;

       ;

      则赋值语句:student.num=199401;是错误的。

第二类错误分析

    1在用scanf函数给普通变量输入数据时,在变量名前漏写地址运算符&

      :scanf(″dd″, x, y);

   2scanf函数调用语句中,企图规定输入实型数据的小数位。

      如执行以下语句:

       scanf(″6.2f″, &a);

   3输入数据时的数据形式与要求不符。

      scanf函数输入数据时,必须注意要与scanf语句中的对应形式匹配。如:

       scanf(″d,d″,&x, &y);

      若按以下形式输入数据:

       2 4

      是不合法。数据24之间应当有逗号。

   4输入、输出时的数据类型与所用格式说明符不匹配。

      例如有以下说明语句:

       int x=1; float y=2.5;

      则运行时执行语句

      printf(″x=f, y=dn″, x, y);

      将给出与原意不符的结果:(TURBO C 2.0 下运行)

   5混淆"=""=="

      C语言中,"="赋值运算符,"=="是关系运算符。

   6在不该出现分号的地方加了分号。

      例如:if(xy)

         printf(″x is larger than y. n″);

   7对于复合语句,忘记加花括号。

      例如: i=1; a=0;

          while (i=10)

          a+=i; i++;

          printf(″a=dn″,a);

   8误把数组说明时所定义的元素个数作为最大下标值使用。

      C语言规定,引用数组元素时下标从0开始,即下标值的下限为0,而下标的上限值是数组定义时元素个数减1

   9switch语句的各分支中未使用break语句。

      例如: switch(grade)

         case′A′: printf(″85 100n″);

          case′B′: printf(″70 84n″);

          case′C′: printf(″60 69n″);

          case′D′: printf(″60n″);

          default:

          printf(″Errorn″);

         

   10混淆break语句和continue语句的作用。

      例如: do

         scanf(″d″,&x);

          if(x0) break;

          printf(″dn″,x);

          while(x! =0);

   11使用++--运算符时易犯的错误。

       如:main()

        int a5={12345}*p;

         p=a;

         printf(″dn″,*(p++));

         

       

   12误解形参值的变化会影响实参的值。

       例如: main()

          int a=1, b=3;

           swap(a, b);

           printf(″a=d, b=dn″,a,b);

         

          swap(x,y)

          int x,y;

          int m;

           m=x; x=y; y=m;

         

    原意想通过调用swap函数使ab的值对换,然而,从输出结果可知ab的值并未进行交换。

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值