独家首发 名师解析2008二级C之选择题(2)

技术与开发

大家是不是觉得上期的选择题比较简单,丢分较少?毕竟那是选择题上半部分,选择题下半部分就相对难一些了,下半部分选择题考得如何?看了我们解析你就心中有数了(选择题全部答案请到http://www.cpcw.com/bzsoft下载)。

第27题:有定义语句:char s[10];,若要从终端给 s 输入 5 个字符,错误的输入语句是

A)gets(&s[0]);  B)scanf("%s",s+1);

C)gets(s);    D)scanf("%s",s[1]);

本题难度:中等

涉及知识:字符串输入

名师解析:此题考核字符串输入的含义,在C语言中对字符串的输入函数有:gets( )、scanf()等,在使用时必须给出存储的地址,即数组名或地址。D选项给出的是一个数组元素,不合语法。

第31题:有以下程序

#include

main()

{ int s[12]={1,2,3,4,4,3,2,1,1,1,2,3},c[5]={0},i;

for(i=0;i<12;i++)

c[s[i]]++;

for(i=1;i<5;i++)

printf("%d",c[i]);

printf("\n");

}

程序的运行结果是

A)1 2 3 4 B)2 3 4 4

C)4 3 3 2 D )1 1 2 3

本题难度:难

涉及知识:数组下标运算

名师解析:在试题中,定义语句中的c[5]={0}表示对c数组进行初始化,全部置0。第一个for循环对c数组元素进行遍历赋值(即用s数组元素的值来作下标,指定c数组元素的值进行自增运算),第二个for循环执行c数组元素输出。题中最容易出错的就是第一个for循环的运算,考生往往喜欢不算出来而是凭感觉得出答案,这样很容易出错。

第33题:有以下程序

#include

#include

void fun(char *s[ ],int n)

{ char *t; int i,j;

for(i=0;i

for(j=i+1;j

if(strlen(s[i])>strlen(s[j]))

{t=s[i];s[i]=s[j];s[j]=t;}

}

main()

{ char *ss[]={"bcc","bbcc","xy","aaaacc","aabcc"};

fun(ss,5);

printf("%s,%s\n",ss[0],ss[4]);

}

程序的运行结果是

A)xy,aaaacc B)aaaacc,xy

C)bcc,aabcc D)aabcc,bcc

本题难度:较难

涉及知识:字符串指针操作

名师解析:题中ss数组是一个指针数组,而每一个数组元素(即指针变量)又各指向一个字符串,这正是字符串指针的知识难点。在进行操作时,每个ss数组元素表示一个字符串。

fun函数是对ss数组元素按所指向的字符串长度进行从小到大排序。在这里,考生一定要区分数组元素操作与字符串操作。if(strlen(s[i])>strlen(s[j])) {t=s[i]; s[i]=s[j]; s[j]=t; } ,此语句中条件表达式部分为字符串长度函数应用比较,后面的语句段部分则用了数组元素值的交换(即ss数组中元素指向的变换)。明白这一点,就不难得出正确结果了。

第37题:有以下程序

#include

main()

{ FILE *fp;

int a[10]={1,2,3},i,n;

fp=fopen("dl.dat","w");

for(i=0;i<3;i++)

fprintf(fp,"%d",a[i]);

fprintf(fp,"\n");

fclose(fp);

fp=fopen("dl.dat","r");

fscanf(fp,"%d",&n);

fclose(fp);

printf("%d\n",n);

}

程序的运行结果是

A)12300 B) 123 C) 1 D) 321

本题难度:较难

涉及知识:文件操作

名师解析:本题主要考核对文件读取与存入操作相关函数的掌握,是历年必出之题。题中fopen为打开文件的函数,使用时必须添加两个参数,第一个参数为文件名,第二个参数为打开方式(w为写入方式,r为读取方式)。所以代码中for循环是将a数组元素的值逐个存入文件中,然后fscanf函数再将文件中的数据以数值方式读出存入n变量,故得到n=123。

第27题答案:D

第31题答案:C

第33题答案:A

第37题答案:B

下期我们将解析填空题部分敬请关注!