C语言调试常见错误及修改方法附习题.docx
《C语言调试常见错误及修改方法附习题.docx》由会员分享,可在线阅读,更多相关《C语言调试常见错误及修改方法附习题.docx(17页珍藏版)》请在冰豆网上搜索。
C语言调试常见错误及修改方法附习题
1.调试C程序时常见的错误类型分析
一般情况下,错误主要分为两大类:
一、语法错误。
对于这种错误,用编译器很容易解决。
所以,改错题的第一步是先编译,
解决这类语法错误。
下面总结了二级C语言上机改错题中常见的语法错误:
(1)丢失分号,或分号误写成逗号。
(2)关键字拼写错误,如本来小写变成大写。
(3)语句格式错误,例如for语句中多写或者少写分号。
(4)表达式声明错误,例如:
少了()
(5)函数类型说明错误。
与main()函数中不一致。
(6)函数形参类型声明错误。
例如:
少*等。
(7)运算符书写错误,例如:
/写成了\。
二、逻辑错误,或者叫语义错误,这和实现程序功能紧密相关,一般不能用编译器发现。
对于逻辑错误可以按这样的步骤进行查找。
(1)先读试题,看清题目的功能要求。
(2)通读程序,看懂程序中算法的实现方法。
(3)细看程序,发现常见错误点。
2.改错题的改错方式总结,当然这些总结只能对大部分改错行有效。
1、若错误行是函数首部,可分为以下几种情况:
A、该行最后若有分号则删除,中间若有分号则改成逗号
B、形参类型不一致的问题,特别是指针类型,若后面用到某形参时有指针运算则该形参必为指针类型;若形参是二维数组或指向m个元素的指针变量,则第二维的长度必须与main中对应数组的第二维长度相同
C、函数类型不一致的问题,若函数中没有return语句则函数类型为void,若有return语句则函数的类型必须与return后变量的类型一致。
2、若错误行是if或while语句,则首先看有没有用小括号将整个表达式括起,若没有则加上小括号。
3、若错误行中有if、while、for则要特别注意条件表达式的错误问题:
A、指针变量的应用,若表达式中有指针变量且没有指针运算符,则加上指针运算符
B、若条件表达式中只有一个等于号,则改成两个等于号,若为其它比较运算符则一般是进行逆转或加一个等于号
C、for中要用分号分隔表达式,而不是用逗号
4、语法错误
A、语句缺少分号,若错误行中有语句没有用分号结束,则加上分号。
B、大小写不对,若错误行中有大写字母则一般都改成小写字母。
5、指针变量的运用,若错误行中有指针变量,并且该变量名前没有指针运算符则一般都是加上指针运算符
6、若错误行为return语句,则首先看是否是缺少分号若是则加上分号即可;否则就是return后的变量或表达式错误(此时可通过看题意,来分析该返回哪一变量或表达式)
7、若错误行中见到整型1除以某个表达式时,一概改成。
但若是整型变量或表达式则只能用强制转换
8、复合运算符写错
9、字符串结束符写错,若有字符串结束符则要特别注意有没有写错,但第11题例外,因为该题是要将数字字符转换成对应的数字。
10、若错误行是定义语句,则首先看类型是否符合;再看所赋初值是否正确;若以上均不是,则看是否少定义了某个变量或少了花括号。
11、表达式错误(占的份量最多,并且没有统一的改法,我们只能通过题目要求来分析并修改)
12、若错误行中有一条横线,则必须将横线删除再填空。
填空题中亦是如此。
例题
/*1.下面给定的程序的功能是:
读入一个整数k(2<=k<=10000),打印他所有的质因子(即所有为素数的的质因子)。
例如,若输入整数2310,则应输出:
2、3、5、7、11。
请改正程序中的错误,使程序得到正确的结果。
注意:
不要改动main函数,不得增行或删行,也不得更改程序的结构!
试题程序:
1 #include<>
2 #include<>
3 IsPrime(intn);
4 {
5 inti,m;
6 m=1;
7 for(i=2;i8 if!
(n%i)
9 {
10 m=0;break;
11 }
12 return(m);
13 }
14 main()
15 {
16 intj,k;
17 clrscr();
18 printf("\nPleaseenteranintegernunber2and10000:
");scanf("%d",&k);
19 printf("\n\nThePrimefactor(s)of%dis(are):
",k);
20 for(j=2;j<=k;j++)
21 if((!
(k%j))&&(IsPrime(j)))
22 printf("\n%4d",j);
23 printf("\n");
24 }
试题解答及分析
错误一:
第三行的末尾不需要分号,这并不是一个语句的结束,这是一个函数的头部;
错误二:
第八行应该该为if(!
(n%i)),这是由if语句的执行过程决定的,if语句先判断紧跟着它的()里面的条件的真假,如果真执行下面的语句,如果是多条语句可以用{}括起来如果嫁就跳过直接执行下面的语句但这个if语句中把括号忘了。
自然出错;
程序整体分析
我们的题目要求判断求出一个整数的所有质因子我们可以求出它所有的因子,再看这些因子中哪些是素数不就行了,程序先通过scanf("%d",%k);从键盘读入一个整数,接着我们开始循环,对于2到k之间的每一个j;用!
(k%j)判断j是不是k的因子,如果是的话,k%j=0,则非0就是真的,再用一个判断它是不是素数的函数IsPrime(intn)来判断它是不是素数,如果是的话就是我们所求的。
IsPrime()函数分析,函数语句的意思是,只要2到n中有任意一个数有能被n整除的话,就返回0(假),否则返回1(真),我们看一下循环体if(!
(n%i))这个语句的分析上面有,只要n能把i整除的话m=0,break语句会使程序立刻跳出循环体,执行return(m);语句。
*/
#include<>
#include<>
IsPrime(intn)
{
inti,m;
m=1;
for(i=2;i if(!
(n%i))
{
m=0;break;
}
return(m);
}
main()
{
intj,k;
clrscr();
printf("\nPleaseenteranintegernunber2and10000:
");scanf("%d",&k);
printf("\n\nThePrimefactor(s)of%dis(are):
",k);
for(j=2;j<=k;j++)
if((!
(k%j))&&(IsPrime(j)))
printf("\n%4d",j);
printf("\n");
}
改错题集
第1题
给定程序中函数fun的功能是:
把在字符串s中出现的每个字符,紧随其后重复出现一次,形成一个新串放在t中,t中字符按原字符串中字符顺序排列。
例如:
当s中的字符串为:
"ABAABBCCDDEE"。
则t中的字符串应为:
"AABBCCDDEE"。
请改正函数fun中的错误,使它能得出正确的结果。
注意:
不要改动main函数,不得增行或删行,也不得更改程序的结构!
#include
#include
#include
/************found************/
voidfun(chars,chart)/参考答案:
voidfun(char*s,char*t)/
{inti,sl;
sl=strlen(s);
for(i=0;i
{t[2*i]=s[i];
t[2*i+1]=s[i];
}
/************found************/
t[2*sl]='0';/参考答案:
t[2*sl]='\0';/
}
main()
{chars[100],t[100];
clrscr();
printf("\nPleaseenterstrings:
");scanf("%s",s);
fun(s,t);
printf("Theresultis:
%s\n",t);
}
第2题
给定程序中函数fun的功能是:
把在字符串s中出现的每个字符,紧随其后重复出现一次,放在一个新串t中,t中字符按原字符串中逆排列。
例如:
当s中的字符串为:
"ABCDE"时,
则t中的字符串应为:
"EEDDCCBBAA"。
请改正函数fun中的错误,使它能得出正确的结果。
注意:
不要改动main函数,不得增行或删行,也不得更改程序的结构!
#include
#include
#include
voidfun(char*s,char*t)
{inti,sl;
sl=strlen(s);
/************found************/
for(i=1;i
{t[2*i]=s[sl-i-1];
t[2*i+1]=s[sl-i-1];
}
/************found************/
t[2*sl]='0/';/参考答案:
t[2*sl]='\0';/
}
main()
{chars[100],t[100];
clrscr();
printf("\nPleaseenterstrings:
");scanf("%s",s);
fun(s,t);
printf("Theresultis:
%s\n",t);
}
第3题
给定程序中函数fun的功能是:
将在字符串s中下标为偶数位置上的字符,紧随其后重复出现一次,放在一个新串t中,t中字符按原字符串中字符的顺序排列。
(注意0为偶数)
例如:
当s中的字符串为:
"ABCDE"时,
则t中的字符串应为:
"AACCEE"。
请改正函数fun中的错误,使它能得出正确的结果。
注意:
不要改动main函数,不得增行或删行,也不得更改程序的结构!
#include
#include
#include
voidfun(char*s,char*t)
{inti,j,sl;
sl=strlen(s);
/************found************/
for(i=0,j=0;i{t[2*j]=s[i];
t[2*j+1]=s[i];
j++;
}
/************found************/
t[2*sl]='\0';/参考答案:
t[2*j]='\0';/
}
main()
{chars[100],t[100];
clrscr();
printf("\nPleaseenterstrings:
");scanf("%s",s);
fun(s,t);
printf("Theresultis:
%s\n",t);
}
第4题
给定程序中函数fun的功能是:
将在字符串s中下标为奇数位置上的字符,紧随其后重复出现一次,放在一个新串t中,t中字符按原字符串中字符的顺序排列。
(注意0为偶数)
例如:
当s中的字符串为:
"ABCDEF"时,
则t中的字符串应为:
"BBDDFF"。
请改正函数fun中的错误,使它能得出正确的结果。
注意:
不要改动main函数,不得增行或删行,也不得更改程序的结构!
#include
#include
#include
voidfun(char*s,char*t)
{inti,j,sl;
sl=strlen(s);
/************found************/
for(i=0,j=0;i{t[2*j]=s[i];
t[2*j+1]=s[i];
/************found************/
j--;/参考答案:
j++/
}
t[2*j]='\0';
}
main()
{chars[100],t[100];
clrscr();
printf("\nPleaseenterstrings:
");scanf("%s",s);
fun(s,t);
printf("Theresultis:
%s\n",t);
}
第5题
给定程序中函数fun的功能是:
将在字符串s中下标为偶数位置上的字符,紧随其后重复出现一次,放在一个新串t中,t中字符按原字符串中字符出现的逆序排列。
(注意0为偶数)
例如:
当s中的字符串为:
"ABCDEF"时,
则t中的字符串应为:
"EECCAA"。
请改正函数fun中的错误,使它能得出正确的结果。
注意:
不要改动main函数,不得增行或删行,也不得更改程序的结构!
#include
#include
#include
voidfun(char*s,char*t)
{inti,j,sl;
sl=strlen(s);
if(sl%2)sl--;elsesl-=2;
/************found************/
for(i=sl,j=0;i>=0;i--)/参考答案:
for(i=sl,j=0;i>=0;i-=2)/
{t[2*j]=s[i];
t[2*j+1]=s[i];
j++;
}
/************found************/
t[2*sl]='\0';/参考答案:
t[2*j]='\0';/
}
main()
{chars[100],t[100];
clrscr();
printf("\nPleaseenterstrings:
");scanf("%s",s);
fun(s,t);
printf("Theresultis:
%s\n",t);
}
第6题
给定程序中函数fun的功能是:
将在字符串s中下标为奇数位置上的字符,紧随其后重复出现一次,放在一个新串t中,t中字符按原字符串中字符出现的逆序排列。
(注意0为偶数)
例如:
当s中的字符串为:
"ABCDEFG"时,
则t中的字符串应为:
"FFDDBB"。
请改正函数fun中的错误,使它能得出正确的结果。
注意:
不要改动main函数,不得增行或删行,也不得更改程序的结构!
#include
#include
#include
voidfun(char*s,char*t)
{inti,j,sl;
sl=strlen(s);
/************found************/
if(sl%2)Sl-=2;elseSl--;/参考答案:
if(sl%2)sl-=2;elsesl--;/
for(i=sl,j=0;i>=0;i-=2)
{t[2*j]=s[i];
t[2*j+1]=s[i];
j++;
}
/************found************/
t[2*sl]='0';/参考答案:
t[2*j]='\0';/
}
main()
{chars[100],t[100];
clrscr();
printf("\nPleaseenterstrings:
");scanf("%s",s);
fun(s,t);
printf("Theresultis:
%s\n",t);
}
第7题
给定程序中函数fun的功能是:
把在字符串s中出现的每个字符,紧随其后重复出现一次,形成一个新串放在t中,且在t中把原相邻字符的位置进行了交换。
例如:
当s中的字符串为:
"ABCDE"时,
则t中的字符串应为:
"BBAADDCCEE"。
请改正函数fun中的错误,使它能得出正确的结果。
注意:
不要改动main函数,不得增行或删行,也不得更改程序的结构!
#include
#include
#include
voidfun(char*s,char*t)
{
/************found************/
inti,j;/参考答案:
inti,j,sl;/
sl=strlen(s);
for(i=0,j=0;i{if(i+1{t[2*j]=s[i+1];t[2*j+1]=s[i+1];
j++;
}
t[2*j]=s[i];t[2*j+1]=s[i];
/************found************/
j--;/参考答案:
j++;/
}
t[2*sl]='\0';
}
main()
{chars[100],t[100];
clrscr();
printf("\nPleaseenterstrings:
");scanf("%s",s);
fun(s,t);
printf("Theresultis:
%s\n",t);
}
第8题
给定程序中函数fun的功能是:
将在字符串s中出现、而未在字符串t中出现的字符形成一个新的字符串放在u中,u中字符按原字符串中字符顺序排列,不去掉重复字符。
例如:
当s="AABCDE",t="BDFG"字符。
u中的字符串为"AACE"。
请改正函数fun中的错误,使它能得出正确的结果。
注意:
不要改动main函数,不得增行或删行,也不得更改程序的结构!
#include
#include
#include
/************found************/
voidfun(char*s,char*t,charu)/参考答案:
voidfun(char*s,char*t,char*u)
{inti,j,sl,tl;
sl=strlen(s);tl=strlen(t);
for(i=0;i
{for(j=0;j
if(s[i]==t[j])break;
/************found************/
if(j>tl)/参考答案:
if(j>=tl)
*u++=s[i];
}
*u='\0';
}
main()
{chars[100],t[100],u[100];
clrscr();
printf("\nPleaseenterstrings:
");scanf("%s",s);
printf("\nPleaseenterstringt:
");scanf("%s",t);
fun(s,t,u);
printf("theresultis:
%s\n",u);
}
第9题
给定程序中函数fun的功能是:
将未在字符串s中出现而在字符串t中出现的字符形成一个新的字符串放在u中,u中字符按原字符串中字符顺序排列,不去掉重复字符。
例如:
当s="ABCDE",t="BDFGG"时,
u中的字符串为"FGG"。
请改正函数fun中的错误,使它能得出正确的结果。
注意:
不要改动main函数,不得增行或删行,也不得更改程序的结构!
#include
#include
#include
voidfun(char*s,char*t,char*u)
{inti,j,sl,tl;
sl=strlen(s);tl=strlen(t);
/************found************/
for(i=0;i
/************found************/
{for(j=0;j
if(t[i]==s[j])break;
if(j>=sl)*u++=t[i];
}
/************found************/
u='\0';/参考答案*u='\0';
}
main()
{chars[100],t[100],u[100];
clrscr();
printf("\nPleaseenterstrings:
");scanf("%s",s);
printf("\nPleaseenterstringt:
");scanf("%s",t);
fun(s,t,u);
printf("Theresultis:
%s\n",u);
}
第10题
给定程序中函数fun的功能是:
将既在字符串s中出现又在字符串t中出现的字符构成一个新的字符串放在u中,u中字符按原字符串中字符顺序排列,不去掉重复字符。
例如:
当s="ABBCDE",t="BDFG"时,u中的字符串为:
"BBD"。
请改正函数fun中的错误,使它能得出正确的结果。
注意:
不要改动main函数,不得增行或删行,也不得更改程序的结构!
#include
#include
#include
voidfun(char*s,char*t,char*u)
{inti,j,sl,tl;
sl=strlen(s);tl=strlen(t);
for(i=0;i
{for(j=0;j
if(s[i]==t[j])break;
/************found************/
if(j>=tl)/参考答案if(j
*u++=s[i];
}
/************found************/
*u='0';/参考答案*u='\0';
}
main()
{chars[100],t[100],u[100];
clrscr();
printf("\nPleaseenterstrings:
");scanf("%s",s);
printf("\nPleaseenterstringt:
");scanf("%s",t);
fun(s,t,u);
printf("Theresultis:
%s\n",u);
}