内容正文:
编写说明:江苏省对口招生计算机类《考纲百套卷》,依据《江苏省计算机类专业综合理论考试大纲》编写。本专辑涵盖5门课程,第一部分是专业核心模块训练卷,第二部分为各门课程的综合训练卷。本专辑共98份试卷。
本试卷是第25卷为专业核心模块训练卷,按《C语言》中"C语言卷12——字符串与字符数组"范围和要求编写。具体内容为:掌握字符串与字符数组。
江苏省对口招生职业技能考试
C语言 试卷
(C语言卷12——字符串与字符数组)
考试时间:90分钟 满分:100分
一、单项选择题(共20题,每题2分,共40分)
1. 下列关于字符数组,正确的是( )
A.字符数组就是字符串 B.字符数组可以不以\0结束
C.字符串必须用字符数组存储 D.字符数组不能存储字符串
【答案】B
【解析】字符数组可以不包含\0,只有当它用作字符串时才需要\0结束。
2. 下列字符数组初始化正确的是( )
A.char s[ ] = "Hello";(正确,自动添加\0)
B.char s[ ] = {'H','e','l','l','o'};(无\0)
C.char s[6] = "Hello";(正确,\0占一位)
D.以上都正确
【答案】D
【解析】A和B语法都正确,但B存储的不是字符串(没有\0)。C中"Hello"自动包含\0,需要6个字节。
3. 字符串"ABC"在内存中占用____个字节
A.3 B.4(包含\0) C.不确定 D.编译错误
【答案】B
【解析】字符串"ABC"包含'A','B','C','\0'共4个字符。
4. 下列关于字符串输入,正确的是( )
A.scanf("%s",s); 可以读取包含空格的字符串
B.gets(s); 可以读取包含空格的字符串(但不安全)
C.fgets(s,size,stdin); 可以读取包含空格的字符串
D.B和C都可以
【答案】D
【解析】gets可以读入整行(含空格)但已废弃不安全;fgets可以读入指定长度的整行(含空格)。
5. 下列关于字符串输出,正确的是( )
A.printf("%s",s); 输出字符串 B.puts(s); 输出字符串并自动换行
C.两者都可以输出字符串 D.两者都不能输出字符串
【答案】C
【解析】printf("%s",s)和puts(s)都可以输出字符串,puts会自动添加换行。
6. 想要计算字符串长度(不含\0),应该使用( )
A.sizeof(s) B.strlen(s) C.length(s) D.len(s)
【答案】B
【解析】strlen(s)返回字符串长度(不含\0),需要包含<string.h>。
7. 想要复制字符串,应该使用( )
A.s1 = s2;(数组不能整体赋值) B.strcpy(s1,s2)
C.strcopy(s1,s2) D.copy(s1,s2)
【答案】B
【解析】strcpy(dest,src)用于复制字符串,需要包含<string.h>。
8. 想要连接两个字符串,应该使用( )
A.strcat(s1,s2) B.strconnect(s1,s2)
C.strjoin(s1,s2) D.strmerge(s1,s2)
【答案】A
【解析】strcat(dest,src)用于将src连接到dest后面,需要包含<string.h>。
9. 想要比较两个整数的大小应该使用( )
A.strcmp(s1,s2) B.比较两个字符串应该用strcmp
C.strcm(s1,s2) D.比较字符串用compare
【答案】A
【解析】strcmp(s1,s2)比较字符串,返回0表示相等,<0表示s1<s2,>0表示s1>s2。
10. 下列关于char s[10] = "Hello"; 正确的是( )
A.s的长度是5 B.s的长度是10 C.strlen(s)返回5 D.sizeof(s)返回5
【答案】C
【解析】strlen(s)返回字符串实际长度(不含\0)为5,sizeof(s)返回数组大小为10。
11. 想要从键盘读取一个不含空格的字符串,可以使用( )
A.gets(s)(读取整行,含空格)
B.scanf("%s",s)(读取不含空格的字符串)
C.fgets(s,size,stdin)(读取整行,含空格)
D.B和C都可以
【答案】B
【解析】scanf("%s",s)读取到空格为止,不含空格;fgets读取整行(含空格)。
12. char s[ ] = "Hello"; 则sizeof(s)的值是( )
A.5 B.6(包含\0) C.不确定 D.编译错误
【答案】B
【解析】"Hello"包含6个字符(含\0),sizeof(s)=6。
13. char s[10] = "Hi"; 则s的内容是( )
A.'H','i' B.'H','i','\0',其余为0
C.'H','i',其余不确定 D.编译错误
【答案】B
【解析】部分初始化时,未初始化的元素自动置0(即\0)。
14. 下列关于字符串和字符数组,正确的是( )
A.所有字符数组都是字符串 B.字符串一定以\0结束 C.字符数组一定不能以\0结束 D.字符串不能用字符数组存储
【答案】B
【解析】字符串定义上就是以\0结束的字符序列。
15. 想要判断两个字符串是否相等,应该使用( )
A.if(s1==s2)(比较的是地址)
B.if(strcmp(s1,s2)==0)(正确)
C.if(s1 equals s2)
D.if(strcmp(s1,s2))(非0表示不相等)
【答案】B
【解析】字符串比较必须用strcmp函数,==比较的是指针地址。
16. char s[5] = "Hello"; 正确的是( )
A.正确,刚好容纳 B.错误,需要6个字节(含\0),这里会越界
C.正确,\0可以省略 D.不确定
【答案】B
【解析】"Hello"需要6个字节(含\0),但s只有5个字节,会导致越界。
17. 想要将字符串s2复制到s1,应该使用( )
A.s1 = s2; B.strcpy(s1,s2); C.strcat(s1,s2); D.strcmp(s1,s2);
【答案】B
【解析】strcpy(dest,src)用于复制字符串。
18. 下列关于fgets,正确的是( )
A.fgets会丢弃换行符 B.fgets保留换行符在字符串中 C.fgets不包含换行符 D.fgets已废弃不安全
【答案】B
【解析】fgets会将换行符
读入字符串中(如果缓冲区够大)。
19. char s[ ] = "C Program"; 则strlen(s)的值是( )
A.8 B.9(C+空格+Program) C.10(包含\0) D.11
【答案】B
【解析】"C Program"包含'C',' ','P','r','o','g','r','a','m'共9个字符,不含\0。
20. 想要在字符串s后面追加字符串t,应该使用( )
A.strcpy(s,t) B.strcat(s,t) C.strcmp(s,t) D.strlen(s,t)
【答案】B
【解析】strcat(dest,src)将src连接到dest后面。
二、判断题(共10题,每题1分,共10分)
21. 字符串以\0字符作为结束标志( )
【答案】√
【解析】字符串以空字符\0作为结束标志。
22. 字符数组就是字符串( )
【答案】×
【解析】字符数组可以不包含\0,只有当它用作字符串时才需要\0结束。
23. strlen函数返回字符串长度(含\0)( )
【答案】×
【解析】strlen返回字符串长度,不含\0。
24. sizeof(数组名)返回数组总字节数( )
【答案】√
【解析】sizeof(数组名)返回数组在内存中占用的总字节数。
25. scanf("%s",s)可以读取包含空格的字符串( )
【答案】×
【解析】scanf("%s")读取到空格为止,不含空格;需用fgets读取含空格的整行。
26. 字符串比较必须使用strcmp函数( )
【答案】√
【解析】C语言中字符串不能直接用==比较,必须用strcmp函数。
27. gets函数已废弃,不推荐使用( )
【答案】√
【解析】gets函数不检查缓冲区大小,已废弃,推荐使用fgets。
28. fgets会将换行符
读入字符串中( )
【答案】√
【解析】fgets将换行符
读入字符串中(如果缓冲区允许)。
29. strcpy可以安全地复制任意长度的字符串( )
【答案】×
【解析】strcpy不检查目标缓冲区大小,可能越界,应使用strncpy或确保目标足够大。
30. 字符串字面量如"Hello"在内存中自动包含\0( )
【答案】√
【解析】字符串字面量在内存中以\0自动结束。
三、填空题(共10空,每空2分,共20分)
31. 字符串以____字符作为结束标志。
【答案】\0(空字符)
【解析】字符串以空字符\0作为结束标志。
32. 想要计算字符串长度(不含\0),应该使用函数____。
【答案】strlen
【解析】strlen(s)返回字符串长度(不含\0)。
33. 想要复制字符串,应该使用函数____。
【答案】strcpy
【解析】strcpy(dest,src)用于复制字符串。
34. 想要连接两个字符串,应该使用函数____。
【答案】strcat
【解析】strcat(dest,src)将src连接到dest后面。
35. 想要比较两个字符串,应该使用函数____。
【答案】strcmp
【解析】strcmp(s1,s2)比较字符串,返回0表示相等。
36. 从键盘读取一个不含空格的字符串,可以使用scanf("____",s)。
【答案】%s
【解析】scanf("%s",s)读取不含空格的字符串。
37. 从键盘读取一整行(含空格),应该使用函数____。
【答案】fgets
【解析】fgets(s,size,stdin)读取整行(含空格)。
38. 字符串"Hi"在内存中占用____个字节(含\0)。
【答案】3
【解析】'H','i','\0'共3个字节。
39. char s[ ] = "Hello"; 则sizeof(s)的值是____。
【答案】6
【解析】"Hello"包含6个字符(含\0),sizeof(s)=6。
40. char s[10] = "Hi"; 则未初始化的元素自动置____。
【答案】0(\0)
【解析】部分初始化时,未初始化的元素自动置0。
四、程序综合题(共3题,每题10分,共30分)
41. 程序阅读题:阅读下列程序,写出运行结果。
#include <stdio.h>
#include <string.h>
int main()
{
char s[]="abc123XYZ";
int i,la=0,ln=0,lo=0;
for(i=0;s[i]!='\0';i++)
{
if(s[i]>='a'&&s[i]<='z') la++;
else if(s[i]>='0'&&s[i]<='9') ln++;
else if(s[i]>='A'&&s[i]<='Z') lo++;
}
printf("la=%d,ln=%d,lo=%d
",la,ln,lo);
printf("len=%d
",strlen(s));
return 0;
}
【答案】
la=3,ln=3,lo=3
len=9
【解析】
1.字符串abc123XYZ包含 3 个小写字母、3 个数字、3 个大写字母,对应 la=3,ln=3,lo=3;
2.字符串总长度为 9,strlen(s)计算结果为 9,输出 len=9。
42.文件survey.dat存储问卷编号和问题选项(1-5)。统计每个选项出现的次数,按次数降序输出,次数相同按选项升序。请完善程序。
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define N 300
void sort_count(int opt[],int cnt[],int n);
int main()
{
FILE *fp;
int i=0,n,j;
int choice[N],count[6]={0};
fp=fopen("survey.dat","r");
while(!feof(fp))
{
fscanf(fp,"%d",&choice[i]);
if(choice[i]>=1&&choice[i]<=5)
①;
i++;
}
n=i;
fclose(fp);
for(i=1;i<=5;i++)
count[i]=0;
for(i=0;i<n;i++)
count[choice[i]]++;
sort_count(choice,count,6);
for(i=1;i<=5;i++)
if(count[i]>0)
printf("%d:%d
",i,count[i]);
return 0;
}
void sort_count(int opt[],int cnt[],int n)
{
int i,j,t;
for(i=1;i<n-1;i++)
for(j=i+1;j<n;j++)
if(cnt[i]<cnt[j]||(cnt[i]==cnt[j]&&opt[i]>opt[j]))
{
②;
}
}
【答案】
①空语句(不填代码 / 无需操作) 或 理解题意最优填空:无有效执行语句
② t=cnt[i];cnt[i]=cnt[j];cnt[j]=t;t=opt[i];opt[i]=opt[j];opt[j]=t;
【解析】
1. 关于①空:
程序逻辑分为两步:先循环读取所有有效选项存入 choice 数组、统计总个数;读取完毕后统一清零count数组,再二次遍历 choice 数组批量统计次数。因此while循环内仅需筛选合法选项,不需要做计数操作,原答案计数属于多余无效代码,会被后续清零覆盖。
2. 关于②空:
排序规则:次数降序,次数相等则选项升序。判断条件同时使用了 cnt[i]/cnt[j](次数)和 opt[i]/opt[j](选项编号),因此交换时必须同步交换计数值cnt和选项值opt,保证下标对应的选项、次数一一对应,否则排序错乱、结果错误。
43.文件ip.dat存储IP地址字符串。按IP地址的数值大小升序排列后输出(相同IP保留一条)。请完善程序。
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define N 200
long ip_to_num(char ip[]);
void sort_ip(char ip[][20],int n);
int main()
{
FILE *fp;
int i=0,n;
char ip[N][20],tmp[N][20];
fp=fopen("ip.dat","r");
while(!feof(fp))
{
fscanf(fp,"%s",ip[i]);
①;
}
n=i;
fclose(fp);
sort_ip(ip,n);
printf("%s
",ip[0]);
for(i=1;i<n;i++)
if(strcmp(ip[i],ip[i-1])!=0)
printf("%s
",ip[i]);
return 0;
}
long ip_to_num(char ip[])
{
long num=0;
char *p=strtok(ip,".");
while(p)
{
num=num*256+atoi(p);
p=strtok(NULL,".");
}
return num;
}
void sort_ip(char ip[][20],int n)
{
int i,j,p;
char tip[20];
for(i=0;i<n-1;i++)
{
p=i;
for(j=i+1;j<n;j++)
if(②)
p=j;
if(p!=i)
{
strcpy(tip,ip[p]);strcpy(ip[p],ip[i]);strcpy(ip[i],tip);
}
}
}
【答案】① i++ ② ip_to_num (ip [p]) > ip_to_num (ip [j])
【解析】
① 每读取一条 IP 地址,数组下标 i 自增 1,统计总记录数;
② 将 IP 转为数值后比较,按数值升序排序,满足条件则更新位置。
学科网(北京)股份有限公司
$
编写说明:江苏省对口招生计算机类《考纲百套卷》,依据《江苏省计算机类专业综合理论考试大纲》编写。本专辑涵盖5门课程,第一部分是专业核心模块训练卷,第二部分为各门课程的综合训练卷。本专辑共98份试卷。
本试卷是第25卷为专业核心模块训练卷,按《C语言》中"C语言卷12——字符串与字符数组"范围和要求编写。具体内容为:掌握字符串与字符数组。
江苏省对口招生职业技能考试
C语言 试卷
(C语言卷12——字符串与字符数组)
考试时间:90分钟 满分:100分
一、单项选择题(共20题,每题2分,共40分)
1. 下列关于字符数组,正确的是( )
A.字符数组就是字符串 B.字符数组可以不以\0结束
C.字符串必须用字符数组存储 D.字符数组不能存储字符串
2. 下列字符数组初始化正确的是( )
A.char s[ ] = "Hello";
B.char s[ ] = {'H','e','l','l','o'};
C.char s[6] = "Hello";
D.以上都正确
3. 字符串"ABC"在内存中占用____个字节
A.3 B.4(包含\0) C.不确定 D.编译错误
4. 下列关于字符串输入,正确的是( )
A.scanf("%s",s); 可以读取包含空格的字符串
B.gets(s); 可以读取包含空格的字符串
C.fgets(s,size,stdin); 可以读取包含空格的字符串
D.B和C都可以
5. 下列关于字符串输出,正确的是( )
A.printf("%s",s); B.puts(s);
C.两者都可以输出字符串 D.两者都不能输出字符串
6. 想要计算字符串长度(不含\0),应该使用( )
A.sizeof(s) B.strlen(s) C.length(s) D.len(s)
7. 想要复制字符串,应该使用( )
A.s1 = s2; B.strcpy(s1,s2)
C.strcopy(s1,s2) D.copy(s1,s2)
8. 想要连接两个字符串,应该使用( )
A.strcat(s1,s2) B.strconnect(s1,s2)
C.strjoin(s1,s2) D.strmerge(s1,s2)
9. 想要比较两个整数的大小应该使用( )
A.strcmp(s1,s2) B.比较两个字符串应该用strcmp
C.strcm(s1,s2) D.比较字符串用compare
10. 下列关于char s[10] = "Hello"; 正确的是( )
A.s的长度是5 B.s的长度是10 C.strlen(s)返回5 D.sizeof(s)返回5
11. 想要从键盘读取一个不含空格的字符串,可以使用( )
A.gets(s)
B.scanf("%s",s)
C.fgets(s,size,stdin)
D.B和C都可以
12. char s[ ] = "Hello"; 则sizeof(s)的值是( )
A.5 B.6 C.不确定 D.编译错误
13. char s[10] = "Hi"; 则s的内容是( )
A.'H','i' B.'H','i','\0',其余为0
C.'H','i',其余不确定 D.编译错误
14. 下列关于字符串和字符数组,正确的是( )
A.所有字符数组都是字符串 B.字符串一定以\0结束
C.字符数组一定不能以\0结束 D.字符串不能用字符数组存储
15. 想要判断两个字符串是否相等,应该使用( )
A.if(s1==s2)
B.if(strcmp(s1,s2)==0)
C.if(s1 equals s2)
D.if(strcmp(s1,s2))
16. char s[5] = "Hello"; 正确的是( )
A.正确,刚好容纳 B.错误,需要6个字节(含\0),这里会越界
C.正确,\0可以省略 D.不确定
17. 想要将字符串s2复制到s1,应该使用( )
A.s1 = s2; B.strcpy(s1,s2); C.strcat(s1,s2); D.strcmp(s1,s2);
18. 下列关于fgets,正确的是( )
A.fgets会丢弃换行符 B.fgets保留换行符在字符串中
C.fgets不包含换行符 D.fgets已废弃不安全
19. char s[ ] = "C Program"; 则strlen(s)的值是( )
A.8 B.9(C+空格+Program) C.10(包含\0) D.11
20. 想要在字符串s后面追加字符串t,应该使用( )
A.strcpy(s,t) B.strcat(s,t) C.strcmp(s,t) D.strlen(s,t)
二、判断题(共10题,每题1分,共10分)
21. 字符串以\0字符作为结束标志( )
22. 字符数组就是字符串( )
23. strlen函数返回字符串长度(含\0)( )
24. sizeof(数组名)返回数组总字节数( )
25. scanf("%s",s)可以读取包含空格的字符串( )
26. 字符串比较必须使用strcmp函数( )
27. gets函数已废弃,不推荐使用( )
28. fgets会将换行符
读入字符串中( )
29. strcpy可以安全地复制任意长度的字符串( )
30. 字符串字面量如"Hello"在内存中自动包含\0( )
三、填空题(共10空,每空2分,共20分)
31. 字符串以____字符作为结束标志。
32. 想要计算字符串长度(不含\0),应该使用函数____。
33. 想要复制字符串,应该使用函数____。
34. 想要连接两个字符串,应该使用函数____。
35. 想要比较两个字符串,应该使用函数____。
36. 从键盘读取一个不含空格的字符串,可以使用scanf("____",s)。
37. 从键盘读取一整行(含空格),应该使用函数____。
38. 字符串"Hi"在内存中占用____个字节(含\0)。
39. char s[ ] = "Hello"; 则sizeof(s)的值是____。
40. char s[10] = "Hi"; 则未初始化的元素自动置____。
四、程序综合题(共3题,每题10分,共30分)
41. 程序阅读题:阅读下列程序,写出运行结果。
#include <stdio.h>
#include <string.h>
int main()
{
char s[]="abc123XYZ";
int i,la=0,ln=0,lo=0;
for(i=0;s[i]!='\0';i++)
{
if(s[i]>='a'&&s[i]<='z') la++;
else if(s[i]>='0'&&s[i]<='9') ln++;
else if(s[i]>='A'&&s[i]<='Z') lo++;
}
printf("la=%d,ln=%d,lo=%d
",la,ln,lo);
printf("len=%d
",strlen(s));
return 0;
}
42.文件survey.dat存储问卷编号和问题选项(1-5)。统计每个选项出现的次数,按次数降序输出,次数相同按选项升序。请完善程序。
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define N 300
void sort_count(int opt[],int cnt[],int n);
int main()
{
FILE *fp;
int i=0,n,j;
int choice[N],count[6]={0};
fp=fopen("survey.dat","r");
while(!feof(fp))
{
fscanf(fp,"%d",&choice[i]);
if(choice[i]>=1&&choice[i]<=5)
①;
i++;
}
n=i;
fclose(fp);
for(i=1;i<=5;i++)
count[i]=0;
for(i=0;i<n;i++)
count[choice[i]]++;
sort_count(choice,count,6);
for(i=1;i<=5;i++)
if(count[i]>0)
printf("%d:%d
",i,count[i]);
return 0;
}
void sort_count(int opt[],int cnt[],int n)
{
int i,j,t;
for(i=1;i<n-1;i++)
for(j=i+1;j<n;j++)
if(cnt[i]<cnt[j]||(cnt[i]==cnt[j]&&opt[i]>opt[j]))
{
②;
}
}
43.文件ip.dat存储IP地址字符串。按IP地址的数值大小升序排列后输出(相同IP保留一条)。请完善程序。
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define N 200
long ip_to_num(char ip[]);
void sort_ip(char ip[][20],int n);
int main()
{
FILE *fp;
int i=0,n;
char ip[N][20],tmp[N][20];
fp=fopen("ip.dat","r");
while(!feof(fp))
{
fscanf(fp,"%s",ip[i]);
①;
}
n=i;
fclose(fp);
sort_ip(ip,n);
printf("%s
",ip[0]);
for(i=1;i<n;i++)
if(strcmp(ip[i],ip[i-1])!=0)
printf("%s
",ip[i]);
return 0;
}
long ip_to_num(char ip[])
{
long num=0;
char *p=strtok(ip,".");
while(p)
{
num=num*256+atoi(p);
p=strtok(NULL,".");
}
return num;
}
void sort_ip(char ip[][20],int n)
{
int i,j,p;
char tip[20];
for(i=0;i<n-1;i++)
{
p=i;
for(j=i+1;j<n;j++)
if(②)
p=j;
if(p!=i)
{
strcpy(tip,ip[p]);strcpy(ip[p],ip[i]);strcpy(ip[i],tip);
}
}
}
学科网(北京)股份有限公司
$