📄 c++错误.txt
字号:
int a[5]={1,2,3,4,5};
printf ("%d,%d,%d,%d,%d",a[0],a[1],a[2],a[3],a[4]);
}
17、混淆字符数组与字符指针的区别
例如:
main ()
{
char str[10];
str="ICCAVR";
printf ("%s\n",str);
}
在上例中,编译必定出错。因为str[10]是一个数组,str代表数组名,是一个常量,不能被赋值,可将str改为指针变量,将字符串"ICCAVR"的首地址赋值给指针变量str,然后在Printf函数中输出字符串。如下:
main ()
{
char *str;
str="ICCAVR";
printf ("%s\n",str);
}
如果坚持要使用数组,一种方式为初始化时赋值,另一种只能在程序中一个一个元素进行赋值。分别如下:
main ()
{
char str[10]="ICCAVR";
printf ("%s\n",str);
}
或
main ()
{
char str[10];
str[0]='I';str[1]='C';str[2]='C';str[3]='A';str[4]='V';
str[5]='R';str[6]='\0';str[7]='\0';str[8]='\0';str[9]='\0';
printf ("%s\n",str);
}
要注意:
char str[10]="ICCAVR";
和
char str[10];
str="ICCAVR";
是不相同的。
18、在引用指针变量之前没有对它赋值
main ()
{
char *p;
scanf ("%s",p);
/* 用户程序 */
}
没有给指针变量赋值就使用它,由于指针变量p的值不确定,因此有可能误指向有用的存储空间,导致程序运行出错。应当改为:
main ()
{
char *p,str[20];
p=str;
scanf ("%s",p);
/* 用户程序 */
}
19、switch语句的各分支漏写了break语句
例如:
switch (time)
{
case 0 : a=0;
case 1 : a=0;
case 2 : a=2;
defult : a=3;
}
上例中,本意是根据time的值来决定a的值,但是最后程序执行的结果都一样(a=3),因为漏写了break语句,程序将从相应的case开始顺序执行,应改为:
switch (time)
{
case 0 : a=0; break;
case 1 : a=0; break;
case 2 : a=2; break;
defult : a=3;
}
20、混淆了字符和字符串的表示形式
例如:
char sex;
sex="M";
由于sex是字符变量,只能存放一个字符,用单引号括起来的是字符常量,才能赋值给一个字符型变量,而用双引号括起来的是字符串常量,它包括两个字符“M”和“\0”,无法存放到字符变量中。应改为:
char sex;
sex='M'
21、使用自加(++)和自减(--)时出错
例如:
main ()
{
int *p,a[5]={0,1,2,3,4};
p=a
printf ("%d",*p++);
}
在上例中,“*p++”本意是指p加1,即指向第1个元素a[1]外,然后输出第一个元素a[1]的值1。但实际上是先执行p++,先使用p的原值,使用后再加1,因此实际执行结果是输出a[0]的值。应改为如下:
main ()
{
int *p,a[5]={0,1,2,3,4};
p=a;
printf ("%d",*(++p));
}
说明:要注意区别p++、*p++、*(++p)和(*p)++的区别,详见“2.7.4 数组的指针和指向数组的指针变量”一节的介绍。
22、所调用的函数在调用语句之后定义,但在调用之前没有说明
例如:
main ()
{
float x=2.0,y=6.0,z;
z=max(x,y);
printf ("%f",z);
}
float max (float x,float y)
{
return (z=x>y ? x:y)
}
在上例的程序中,max函数在main函数之后定义,在调用之前又没有说明,因此出错。应在调用前对函数进行说明:
main ()
{
float max (float x,float y);
float x=2.0,y=6.0,z;
z=max(x,y);
printf ("%f",z);
}
float max (float x,float y)
{
return (x>y ? x:y);
}
也可以将函数max在函数main之前定义。
23、误认为形参值的改变会影响实参的值
例如:
main ()
{
int x=3,y=4;
swap(x,y);
printf ("%d,%d",x,y);
}
int swap (int x,int y)
{
int z;
z=x;x=y;y=z;
}
在上例中,设计者的意图本想是利用swap函数交换x和y的值,但是由于实参和形参之间单向传递,在函数swap中改变了x和y值,main中的x和y是不会改变的。可以改为使用指针的形式,如下:
main ()
{
int x=3,y=4;
int *p1,*p2;
p1=&x ; p2=&y;
swap(p1,p2);
printf ("%d,%d",x,y);
}
int swap (int *p1,int *p2)
{
int z;
z=*p1;*p1=*p2;*p2=z;
}
说明:虽然函数swap在调用函数之后定义,而且在函数main调用之前又没有说明,但是由于swap返回值为整型,C语言规则返回值为整形的函数在调用之前可以不必说明,因此本例中是符合C语法规定的。
24、函数的实参和形参类型不致。
还是使用上例:
main ()
{
int x=3,y=4;
int *p1,*p2;
p1=&x ; p2=&y;
swap(p1,p2);
printf ("%d,%d",x,y);
}
int swap (int p1,int p2)
{
int z;
z=p1;p1=p2;p2=z;
}
C要求实参与形参的类型一致,一个为指向整型变量的指针,另一个为整型变量,类型不同,因此编译出错。
25、不同类型的指针混用
例如:
main ()
{
char x=3,*p1;
int *p2;
p1=&x;
p2=p1;
printf ("%d,%d",x,y);
}
在上例中,设计者本意是想将指针p1所指的值赋p2,但是由于p1与p2所指向的类型不同,不能赋值。在赋值时必须进行强制类型转换。如:
main ()
{
char x=3,*p1;
int *p2;
p1=&x;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -