数组应用典型错误 1、定义数组时,数组名与其它变量同名。 在同一个作用域中,数组名不能与其他变量同名。 如 int a,b,a[10],b[10];将导致语法错误。 应为int A,B,a[10],b[10]; 1、定义数组时,未指定数组长度。 定义数组时,必须指定数组长度,否则编译系统无法为数组分配内存单元。 如 int a[]; 应为int a[100]; 2、定义动态数组。 在C语言中,不允许定义动态数组。即数组长度不能是变量(或含有变量的表达式)。 如 int n=30; int a[n]; 应为int a[30];/*表示数组长度的表达式中,不能包含变量*/ 3、数组元素下标越界。 C语言数组元素的下标是从0开始的,引用数组元素时下标不能越界。 如 int a[10];/*数组元素为a[0],a[1]......a[9]*/ a[10]=60; 应为int a[11]; a[10]=60; 又如 int a[10],i; for(i=1;i<=10;i++) scanf("%d",&a[i]); 应为int a[10],i; for(i=0;i<=9;i++) scanf("%d",&a[i]); 4、给数组元素整体赋值。 只能在初始化时给数组元素整体赋值,而不能在一般赋值语句中给数组元素整体赋值。 如 int a[10]; a[10]={1,2,3,4,5,6,7,8,9,10}; /*此处a[10]看作一个数组元素,同时还存在下标越界*/ 或 int a[10]; a={1,2,3,4,5,6,7,8,9,10}; /*此处数组名a是地址常量,故不能进行赋值*/ 应为int a[10]={1,2,3,4,5,6,7,8,9,10}; 4、输入数组元素不正确。 C语言中通常采用单重循环来输入一维数组的元素。 如 int a[10],i; scanf("%d",&a[i]); /*缺少循环*/ 此处因变量i未赋值,故运行时将会出错。不过即使i已经赋值,也只能输入一个数组元素,而不会输入 全部数组元素。 又如 int a[10]; scanf("%d",a); 试图用一条scanf语句给整个数组输入数据 ,也是不可行的。 应为int a[10],i; for(i=0;i<10;i++) scanf("%d",&a[i]); 5、输出数组元素不正确。 C语言中通常采用单重循环来输出一维数组的元素。 如 int a[10]={1,2,3,4,5,6,7,8,9,10},i; printf("%d ",a[i]); /*缺少循环*/ 此处因变量i未赋值,故运行时将会出错。不过即使i已经赋值,也只能输出一个数组元素,而不会输出 全部数组元素。 又如 int a[10]={1,2,3,4,5,6,7,8,9,10},i; printf("%d ",a); 试图用一条printf语句将整个数组数据输出 ,也是不可行的。 应为int a[10]={1,2,3,4,5,6,7,8,9,10},i; for(i=0;i<10;i++) printf("%d ",a[i]); 5、定义字符数组长度不足。 因字符串末尾隐含一个'\0'字符,故相应字符数组长度至少要比字符串中字符个数多1。 如 char a[5]="Hello"; 应为char a[6]="Hello"; 或 char a[]="Hello"; 6、用scanf输入字符串时调用格式错误。 用scanf输入字符串时,使用%s格式符,此时输入项应为数组名。 如char a[30]; scanf("%s",&a); 应为scanf("%s",a);因为数组名本身就是一个地址,故不需要取地址运算符。 7、用printf输出字符串时调用格式错误。 用printf输出字符串时,使用%s格式符,此时输出项应为数组名。 如char a[30]="Hello World"; printf("%s",a[30]); /*此处a[30]看做数组元素(当然下标已越界),故与格式符%s不匹配*/ 应为char a[30]="Hello World"; printf("%s",a); 8、字符串赋值错误。 如 char a[30],b[30]="Hello World"; a=b;或a="Hello World";均为错误。因为数组名是地址常量,故不能对数组名a赋值。 应为char a[30],b[30]="Hello World"; strcpy(a,b); 或 char a[30],b[30]="Hello World"; int i; for(i=0;a[i]!='\0';i++) a[i]=b[i]; a[i]='\0'; 或 char a[30],b[30]="Hello World"; int i; for(i=0;i<=strlen(b);i++) a[i]=b[i]; 9、字符串比较错误。 如 char a[30]="abcd",b[30]="abdc"; if(a>b) 或if("abcd">"abdc")均为错误。 因为数组名是地址常量,故a>b只是比较数组a和数组b的首地址大小。 而"abcd">"abdc"则是比较字符串"abcd"和字符串"abdc"的首地址大小。 应为if(strcmp(a,b)>0) 10、gets函数调用格式错误。 一个gets函数只能输入一个字符串,且gets函数的参数中不需要格式字符。 如 char a[80],b[80],c[80]; gets(a,b,c); 或gets("%s%s%s",a,b,c);均为错误。 应为char a[80],b[80],c[80]; gets(a); gets(b); gets(c); |
|