數(shù)組應(yīng)用典型錯(cuò)誤
1、定義數(shù)組時(shí),數(shù)組名與其它變量同名。
在同一個(gè)作用域中,數(shù)組名不能與其他變量同名。
如 int a,b,a[10],b[10];將導(dǎo)致語法錯(cuò)誤。
應(yīng)為int A,B,a[10],b[10];
1、定義數(shù)組時(shí),未指定數(shù)組長度。
定義數(shù)組時(shí),必須指定數(shù)組長度,否則編譯系統(tǒng)無法為數(shù)組分配內(nèi)存單元。
如 int a[];
應(yīng)為int a[100];
2、定義動(dòng)態(tài)數(shù)組。
在C語言中,不允許定義動(dòng)態(tài)數(shù)組。即數(shù)組長度不能是變量(或含有變量的表達(dá)式)。
如 int n=30;
int a[n];
應(yīng)為int a[30];/*表示數(shù)組長度的表達(dá)式中,不能包含變量*/
3、數(shù)組元素下標(biāo)越界。
C語言數(shù)組元素的下標(biāo)是從0開始的,引用數(shù)組元素時(shí)下標(biāo)不能越界。
如 int a[10];/*數(shù)組元素為a[0],a[1]......a[9]*/
a[10]=60;
應(yīng)為int a[11];
a[10]=60;
又如 int a[10],i;
for(i=1;i<=10;i++)
scanf("%d",&a[i]);
應(yīng)為int a[10],i;
for(i=0;i<=9;i++)
scanf("%d",&a[i]);
4、給數(shù)組元素整體賦值。
只能在初始化時(shí)給數(shù)組元素整體賦值,而不能在一般賦值語句中給數(shù)組元素整體賦值。
如 int a[10];
a[10]={1,2,3,4,5,6,7,8,9,10}; /*此處a[10]看作一個(gè)數(shù)組元素,同時(shí)還存在下標(biāo)越界*/
或 int a[10];
a={1,2,3,4,5,6,7,8,9,10}; /*此處數(shù)組名a是地址常量,故不能進(jìn)行賦值*/
應(yīng)為int a[10]={1,2,3,4,5,6,7,8,9,10};
4、輸入數(shù)組元素不正確。
C語言中通常采用單重循環(huán)來輸入一維數(shù)組的元素。
如 int a[10],i;
scanf("%d",&a[i]); /*缺少循環(huán)*/
此處因變量i未賦值,故運(yùn)行時(shí)將會(huì)出錯(cuò)。不過即使i已經(jīng)賦值,也只能輸入一個(gè)數(shù)組元素,而不會(huì)輸入
全部數(shù)組元素。
又如
int a[10];
scanf("%d",a);
試圖用一條scanf語句給整個(gè)數(shù)組輸入數(shù)據(jù) ,也是不可行的。
應(yīng)為int a[10],i;
for(i=0;i<10;i++)
scanf("%d",&a[i]);
5、輸出數(shù)組元素不正確。
C語言中通常采用單重循環(huán)來輸出一維數(shù)組的元素。
如 int a[10]={1,2,3,4,5,6,7,8,9,10},i;
printf("%d ",a[i]); /*缺少循環(huán)*/
此處因變量i未賦值,故運(yùn)行時(shí)將會(huì)出錯(cuò)。不過即使i已經(jīng)賦值,也只能輸出一個(gè)數(shù)組元素,而不會(huì)輸出
全部數(shù)組元素。
又如
int a[10]={1,2,3,4,5,6,7,8,9,10},i;
printf("%d ",a);
試圖用一條printf語句將整個(gè)數(shù)組數(shù)據(jù)輸出 ,也是不可行的。
應(yīng)為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、定義字符數(shù)組長度不足。
因字符串末尾隱含一個(gè)'\0'字符,故相應(yīng)字符數(shù)組長度至少要比字符串中字符個(gè)數(shù)多1。
如 char a[5]="Hello";
應(yīng)為char a[6]="Hello";
或 char a[]="Hello";
6、用scanf輸入字符串時(shí)調(diào)用格式錯(cuò)誤。
用scanf輸入字符串時(shí),使用%s格式符,此時(shí)輸入項(xiàng)應(yīng)為數(shù)組名。
如char a[30];
scanf("%s",&a);
應(yīng)為scanf("%s",a);因?yàn)閿?shù)組名本身就是一個(gè)地址,故不需要取地址運(yùn)算符。
7、用printf輸出字符串時(shí)調(diào)用格式錯(cuò)誤。
用printf輸出字符串時(shí),使用%s格式符,此時(shí)輸出項(xiàng)應(yīng)為數(shù)組名。
如char a[30]="Hello World";
printf("%s",a[30]); /*此處a[30]看做數(shù)組元素(當(dāng)然下標(biāo)已越界),故與格式符%s不匹配*/
應(yīng)為char a[30]="Hello World";
printf("%s",a);
8、字符串賦值錯(cuò)誤。
如 char a[30],b[30]="Hello World";
a=b;或a="Hello World";均為錯(cuò)誤。因?yàn)閿?shù)組名是地址常量,故不能對(duì)數(shù)組名a賦值。
應(yīng)為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、字符串比較錯(cuò)誤。
如 char a[30]="abcd",b[30]="abdc";
if(a>b)
或if("abcd">"abdc")均為錯(cuò)誤。
因?yàn)閿?shù)組名是地址常量,故a>b只是比較數(shù)組a和數(shù)組b的首地址大小。
而"abcd">"abdc"則是比較字符串"abcd"和字符串"abdc"的首地址大小。
應(yīng)為if(strcmp(a,b)>0)
10、gets函數(shù)調(diào)用格式錯(cuò)誤。
一個(gè)gets函數(shù)只能輸入一個(gè)字符串,且gets函數(shù)的參數(shù)中不需要格式字符。
如 char a[80],b[80],c[80];
gets(a,b,c);
或gets("%s%s%s",a,b,c);均為錯(cuò)誤。
應(yīng)為char a[80],b[80],c[80];
gets(a);
gets(b);
gets(c);
聯(lián)系客服