聪智学校
{ char a[30],b[30]; scanf(\gets(b);
printf(\
1,“012xy”中的数字字符只有三个,所以选择B。
9.知识点:字符串处理函数
例1:(2011-09-32)有以下程序: #include
{ char a[5][10]={“china”,”beijing”,”you”,”tiananmen”,”welcome”}; int i,j; char t[10];
}程序运行时若输入:how are you? I am fine<回车>则输出结果是(B) A)how are you? B)how I am fine
are you?I am fine
C)how are you? I am fine D)row are you?
【解析】:scanf以空格作为字符串输入结束的标志,而gets(s)不会。所以a得到的for(i=0;i<4;i++) 是“how”,b得到的是剩下的“are you? I am fine”。故选择B。 例3:(2011-03)有以下程序 main() {
char s[]=\int i, n=0; for(i=0;s[i]!=0;i++)
if(s[i]>='0'&&s[i]<='9') n++;
for(j=i+1;j<5;j++) if(strcmp(a[i],a[j])>0)
{ strcpy(t,a[i]); strcpy(a[i],a[j]); strcpy(a[i],t);} puts(a[3]);
}程序运行后的输出结果是 (C) A.beijing B.china
C.welcome
D.tiananmen
【解析】双层for循环部分是典型的排序方法,通过strcmp比较两个字符串的大小,然后借助t数组作为中转数组,通过strcpy函数完成a[i]和a[j]两个字符串的交换,使a数组按从小到大排序,即{”beijing” , “china” , ”tiananmen”,”welcome” ,”you” } 例1:(2010-09-23)有以下程序
printf(\
} 程序运行后的输出结果是 (B)
A)0 B)3 C)7 D)8
【解析】:for循环读取字符数组s中的字符,当读到0时退出循环,注意0和‘0’#include
第 26 页 共 61 页
聪智学校
{char x[]=”STRING”; x[0]=0;x[1]=?\\0?;x[2]=?0?;
printf(“%d %d\\n”,sizeof(x),strlen(x)); 【解析】若字符串s1等于字符串s2,strcmp(s2,s1)==0,故答案是A。
}程序运行后的输出结果是(B) A)6 1 B)7 0 C)6 3 D)7 1
【解析】经过x[0]=0;x[1]=?\\0?;x[2]=?0?;后,x[]=”0\\00ING”。strlen测字符串的实际长度,不含字符串结束标志?\\0?,故strlen(x)为0。sizeof测字符串所占的存储空间,包含字符串结束标志,故sizeof(x)为7。 例2:(2010-09-33)有以下程序 #include
{char a[20]=”ABCD\\0EFG\\0”,b[]=”IJK”; strcat(a,b); printf(“%s\\n”,a); }程序运行后的输出结果是(B)
A)ABCDE\\0FG\\0IJK B)ABCDIJK C)IJK D)EFGIJK
【解析】把字符数组b中的字符串连接到字符数组a中字符串的后面,并删去字符串a后的第一个字符串结束标志?\\0?。故输出结果为ABCDIJK。
例3: (2010-09-31)下列选项中,能够满足“若字符串s1等于字符串s2,则执行ST”要求的是 (A)
A)if(strcmp(s2,s1)==0)ST; B)if(s1==s2)ST; C)if(strcpy(s1,s2)==1)ST; D)if(s1-s2==0)ST;
第 27 页 共 61 页
聪智学校
第四课 指针
第 28 页 共 61 页
聪智学校
本课重要知识点: 1.知识点:指针的概念与指针变量
第 29 页 共 61 页
聪智学校
? 指针就是地址。指针变量是用来存储地址,而一般变量是用来存储数值。 读入数据的程序段是 (D)
A)*p=&a; scanf(\%lf\,p); B)*p=&a; scanf(\%f\,p); C)p=&a; scanf(\%lf\,*p); D)p=&a; scanf(\%lf\,p);
【解析】对于scanf函数,输入数据列表必须是合法地址表达式(可以使地 址常量、指针),A选项、B选项*使用错误。
例3.(09-03-16)若有定义语句 doule x,y,*px,*py;执行了px=&x;py=&y;之后,正确的
例1.(09-09-26)有如下程序输出结果为 1,2,2,1 #include
int m=1,n=2,*p=&m,*q=&n,*r; r=p ;p=q ;q=r ;
printf(“%d,%d,%d,%d\\n”,m,n,*p,*q) ;
【解析】p、q为指针,初始化时p指向m,q指向n。执行r=p ;p=q ;q=r ;p和q的输入语句是(C) 值交换,从而p指向n,q指向m。指针的改变不会应用m、n的值,最后输出*p 和*q的值分别为n、m的值。
A) scanf(\%f%f\ C) scanf(\%f%le\
B) scanf(\%f%f\D) scanf(\%lf%lf\
2.知识点:指针的引用
?
指针的引用是通过两个运算符实现“&”和“*”实现的
【解析】A,D选项中的x,y缺少取地址符,B项中&x之前缺少逗号,格式不正确。
3.知识点:指针变量的初始化
指针变量在使用前必须要初始化,把一个具体的地址赋给它,否则引用时会出错,如果不指向任何数据就赋“空值”NULL。 ?
指针变量两种初始化方法:方法一:int a=2,*p=&a;(定义的同时初始化) 方法二:int a=2,*p;p=&a;(先定义后初始化)
&是取地址符号,它的一半格式是:&变量名。例如:int i ; &i表示取i的地址。 ? *是取值运算符,它的一般格式:*指针变量名。例如:int i=10,*p=&i; *p表示取i的值10
例1.(2011-09-25)若定义语句:int year=2009,*p=&year;,以下不能使变量year中的值 增至2010的语句是 (D)
A.*p+=1;
B.(*p)++;
C.++(*p);
D.*p++;
例1.(07—04—29)设已有定义:float x;则以下对指针变量P进行定义且赋初值的语句中正确的是 (D)
【解析】*和++同级别,按自左向右的结合方向,因此D选项可转变为*(p++),A)float *p=1034; B)int *p=(float)x; C)float p=&x; D)float *p=&x; 从而只是使指针发生移动,而不能将p所指变量增1
【解析】可以给一个指针赋值的只能是一个与该指针同类型的指针(或地址值);故
例2.(06—04—24)若有说明语句:double *p,a;则能通过scanf语句正确给输入项A、B选项错误;C选项声明指针出错,P前面的指针说明符*不能省略。
第 30 页 共 61 页