专题10 字符数组的定义及引用(练习)-山东省(春季高考)软件与应用技术类《C语言程序设计知识》考纲讲练测

| 2份
| 12页
| 1人阅读
| 0人下载

内容正文:

编写说明:本专辑为山东省(春季高考)软件与应用技术类《C语言程序设计知识考纲讲练测》,严格依据山东省春季高考软件与应用技术类专业考试大纲(C语言程序设计部分)编写,精准对标考纲,兼顾考点覆盖与实战应用。每套讲练测提供讲义、课件、练习三大配套教学文件,贯穿九大核心环节:考点解读、思维导图、知识梳理、背诵环节、常考题、模拟题、课堂练习、课堂小结及课后测验,形成“讲-练-测-评”闭环式教学与复习逻辑,助力考生夯实基础、突破重难点。 山东省软件与应用技术类 《C语言程序设计知识考纲讲练测》 专题10 字符数组的定义及引用 班级      姓名      学号      成绩       一、单项选择题(本大题共15小题,每题4分,共60分) 1.关于字符数组,说法正确的是(  )。 A、char s[5]; 可以存放字符串 "hello" B、字符数组不能用来存放字符串 C、字符数组的每个元素占 1 个字节 D、字符数组的元素类型可以是 int 【答案】C 【解析】字符数组的元素类型是 char,每个元素占 1 个字节,元素个数等于占用字节数。存放字符串 "hello" 至少要 6 个位置(5 个字符加一个 '\0'),长度 5 的数组放不下;C 语言正是用字符数组来存放字符串的,元素类型也不能换成 int。 2.转义字符 '\0' 的 ASCII 值是(  )。 A、0 B、32 C、48 D、65 【答案】A 【解析】'\0' 是 ASCII 值为 0 的字符,它是字符串的结束标志,屏幕上不显示。48 是数字字符 '0' 的值,65 是 'A' 的值,32 是空格的值,三者都不是空字符。 3.执行 char c='0'; 之后,c 的值与下列哪个相同(  )。 A、'\0' B、0 C、'a' D、48 【答案】D 【解析】'0' 是数字字符,ASCII 值为 48;'\0' 才是值为 0 的结束标志,两者写法只差一个反斜杠,值却相差 48。'a' 的值是 97,与 '0' 无关。 4.若 char s[20]; 中存放字符串 "program",则 strlen(s) 的值是(  )。 A、7 B、6 C、8 D、20 【答案】A 【解析】strlen 只数首次出现 '\0' 之前的字符个数:program 有 7 个字母,所以函数值为 7。数组长度 20 只是容量,与串长无关;若数组里没有任何字符、只放一个 '\0',串长才是 0。 5.用 %s 输入时,输入项写数组名而不加 & 的原因是(  )。 A、%s 格式符不要求地址 B、数组名本身就表示数组的首地址 C、加了 & 会改变数组的类型 D、数组名是常量,不能取地址 【答案】B 【解析】scanf 需要知道往哪里存数据,所以输入项必须给出地址。数组名在表达式中就代表数组的首地址,直接用即可,再加 & 反而变成“数组的地址”,与 %s 的要求不符。这一点与数值数组逐个元素输入必须写 & 恰好相反。 6.char s[40]; scanf("%s", s); 输入 Programming is fun 回车后,s 中的内容是(  )。 A、整个句子 B、Programming is C、空串 D、Programming 【答案】D 【解析】scanf 的 %s 以空格、制表符或回车作为输入结束标志,读到 Programming 后面的空格就停止,数组里只存了 Programming 和一个 '\0'。要读入带空格的整行必须用 gets。 7.关于 gets 与 scanf 输入字符串的说法,正确的是(  )。 A、gets 以回车结束,可读入空格 B、两者都在遇到空格时结束输入 C、gets 不能读入字母 D、scanf 的 %s 可以读入整行句子 【答案】A 【解析】gets 只把回车当作输入结束标志,句子中间的空格会原样存进数组;scanf 的 %s 一遇空格就结束,只能读到一个单词。两者都不限制字符种类,字母自然都能读。 8.执行 char s1[20]="Hello", s2[]="World"; strcpy(s1,s2); 后 s1 的内容是(  )。 A、Hello B、World C、HelloWorld D、WorldHello 【答案】B 【解析】strcpy 把 s2 的内容整体复制到 s1,连末尾的 '\0' 一起搬过去,s1 原来的 Hello 被完全覆盖,所以 s1 变成 World。若换成 strcat,则是把 s2 接到 s1 后面得到 HelloWorld。 9.执行 char s1[20]="Hello", s2[]="World"; strcat(s1,s2); 后 strlen(s1) 的值是(  )。 A、5 B、11 C、10 D、20 【答案】C 【解析】strcat 把 World 接到 Hello 后面,s1 变成 HelloWorld,共 10 个有效字符,strlen 的值为 10。连接时 s1 原来末尾的 '\0' 被覆盖,只在整串末尾重新补一个,所以不是 5+5+1=11。 10.执行 char s1[]="abc", s2[]="abd"; 之后,strcmp(s1,s2) 的函数值(  )。 A、大于 0 B、小于 0 C、等于 0 D、无法确定 【答案】B 【解析】两串前两个字符 ab 相同,第三个字符分别是 c 和 d,'c' 的 ASCII 值 99 小于 'd' 的 100,所以第一个字符串较小,函数值小于 0。strcmp 从第一个不同字符就分出大小,与串长无关。 11.若 strlen(s1) 与 strlen(s2) 相等,则两者的内容(  )。 A、一定相同 B、一定不同 C、无法比较 D、不一定相同 【答案】D 【解析】串长只反映字符个数,不反映字符是什么:abc 与 xyz 长度都是 3,内容却完全不同。要判断内容是否相同必须用 strcmp,函数值为 0 才表示相等。 12.用 %s 输出一个不含 '\0' 的字符数组,输出结果是(  )。 A、只输出数组内的字符 B、编译报错 C、数组字符之后还跟着未知内容 D、什么也不输出 【答案】C 【解析】%s 靠 '\0' 判断何时停止,数组里没有结束标志时系统只能继续往后读,把数组之外存储单元里的数据也当字符输出,屏幕上出现乱码。编译器不做越界检查,所以既不报错也不提示。 13.若 char s[10]="Hi\0There";,则 strlen(s) 的值是(  )。 A、3 B、2 C、8 D、9 【答案】B 【解析】字符串在这里被手工插入了 '\0',strlen 数到它就停止,前面的字符只有 H 和 i 两个,所以函数值为 2。'\0' 之后的 There 虽然还占着存储空间,但已不属于这个字符串。 14.下列程序段中,能把 s1 的内容完整复制到 s2 的是(  )。 A、s2 = s1; B、s2[10] = s1; C、for(i=0;i<=strlen(s1);i++) s2[i]=s1[i]; D、strcat(s2,s1); 【答案】C 【解析】循环用 i<=strlen(s1) 作条件,正好把末尾的 '\0' 也复制过去,s2 才是合法字符串。数组名不能用赋值号整体赋值,s2[10] 只是一个元素、放不下整串;strcat 是把 s1 接到 s2 后面而不是复制。 15.下表列出4段定义及对应的输出效果,判断说法正确的是(  )。 序号 定义 puts 的输出 1 char s[10]="ab\0cd"; ab 2 char s[4]={'a','b','c','d'}; abcd 3 char s[]=""; (空行) 4 char s[6]="ab"; ab A、序号2 的输出内容可以确定 B、序号3 会报错 C、序号4 的 strlen(s) 是 6 D、序号1 只输出 ab 【答案】D 【解析】puts 遇到第一个 '\0' 就停,序号1 的数组在 ab 之后紧接 '\0',所以只输出 ab。序号2 的 4 个元素全部写满、没有 '\0',输出必然延续到数组之外,内容无法确定;序号3 是空串,输出一个空行,不会报错;序号4 的 strlen(s) 是 2,数组长度才是 6。 二、简答题(本大题共2小题,每题10分,共20分) 1.阅读下面的程序,写出程序运行后的输出结果,并回答问题。 #include <stdio.h> #include <string.h> int main(void) { char s[20] = "abCd1234"; int i, n = 0, d = 0; for (i = 0; s[i] != '\0'; i++) { if (s[i] >= 'a' && s[i] <= 'z') n++; if (s[i] >= '0' && s[i] <= '9') d++; } printf("%d,%d,%d ", strlen(s), n, d); return 0; } (1)循环条件 s[i] != '\0' 起到什么作用?(4分) (2)写出程序运行后的完整输出结果。(6分) 【答案】(1)循环条件 s[i] != '\0' 表示“一直处理到字符串结束标志为止”:只要当前元素不是 '\0' 就继续循环,遇到 '\0' 立即结束。这样不必事先知道字符个数,字符串有多长就处理多长,也不会把数组里多余的 '\0' 当成字符处理。(2)输出结果为:8,3,4 【解析】数组初值 abCd1234 共 8 个有效字符,strlen 数到 '\0' 为止得 8。循环里第一个判断把小写字母挑出来:a、b、d 共 3 个;第二个判断把数字字符挑出来:1、2、3、4 共 4 个,大写 C 与两者都不符,不计数。两个 if 是并列的,各自独立判断,所以用两条 if 与用 if…else if 在这一题里结果相同。易错点:把 n 数成 4(把大写 C 也算进小写)、把 d 数成 3(漏掉最后一位 4)、串长答成 9(把 '\0' 也算进长度)。 2.下面的程序想把字符串 hello 存进字符数组并输出,但存在四处错误,请指出错误之处、说明原因并给出正确写法。 #include <stdio.h> int main(void) { char s[5]; s = "hello"; scanf("%s", &s); printf("%c", s); return 0; } 【答案】错误一:char s[5]; 长度不够。"hello" 有 5 个字符,末尾还要放一个 '\0',数组长度至少要 6,应改为 char s[6]; 或更长。错误二:s = "hello"; 非法。数组名是地址常量,定义之后不能用赋值号整体赋值,应在定义处写成 char s[6] = "hello";,或改用 strcpy(s, "hello");。错误三:scanf("%s", &s); 多写了取地址符,数组名本身就是首地址,应改为 scanf("%s", s);。另外 printf("%c", s); 的格式符也错:%c 用来输出一个字符,输出整个字符串要用 %s 并写数组名,即 printf("%s", s);。 【解析】这四处问题分别对应字符数组的四个典型错点:长度没给 '\0' 留位置、把数组当普通变量整体赋值、%s 多写 &、%c 与 %s 混用。前两处编译期就能发现,后两处往往“能编译、结果错”——scanf("%s",&s) 会把数据写到错误的位置,printf("%c",s) 则把首地址的值当成一个字符编码输出。检查这类题的办法是:先数长度(字符个数 + 1),再看有没有用赋值号给数组名赋值,最后核对 %s 的参数与 & 的用法。 三、案例分析题(本大题共1小题,每题10分,共10分) 1.以下程序的功能是:输入一行字符串(可含空格),统计其中大写字母、小写字母和数字字符的个数,并输出该字符串的长度。请在程序的下划线处填入正确的内容,使程序完整并能正确运行。 #include <stdio.h> #include <string.h> int main(void) { char s[81]; int i, up = 0, low = 0, d = 0; gets(s); for (i = 0; ____1____; i++) { if (s[i] >= 'A' && s[i] <= 'Z') ____2____; else if (s[i] >= 'a' && s[i] <= 'z') low++; else if (____3____) d++; } printf("长度=%d,大写=%d,小写=%d,数字=%d ", ____4____, up, low, d); return 0; } 【答案】1.s[i] != '\0'  2.up++  3.s[i] >= '0' && s[i] <= '9'  4.strlen(s) 【解析】本题按“遍历条件—分类计数—输出长度”三步填空。①第一空是循环条件,字符数组不用数长度,直接判断当前元素是不是结束标志,故填 s[i] != '\0'(写 s[i] 或 s[i] != 0 也对)。②第二空要统计大写字母个数,前面的判断已经把大写字母挑出来,这里只需让计数器加一,故填 up++。③第三空是数字字符的判断条件,字符形式的比较要写成 s[i] >= '0' && s[i] <= '9',不能连写成 '0' <= s[i] <= '9'(关系运算符从左往右结合,结果恒为真)。④第四空要输出字符串长度,可以直接调用求串长函数,填 strlen(s)。易错点:第一空写成 i <= 80(把数组里多余的 '\0' 也当成字符处理);第三空写成 s[i] >= 48 && s[i] <= 57 虽也对但看不出含义,或写成 s[i] >= '0' || s[i] <= '9'(用了或,条件恒成立);第四空误填数组长度 81。 四、综合应用题(本大题共2小题,每题5分,共10分) 1.编写一个C语言程序:从键盘输入一行字符串,先求出它的长度并输出,再把其中所有小写字母改成大写后输出(求长度用自己的循环实现,不用求串长函数)。 【答案】#include <stdio.h> int main(void) { char s[81]; int i, n = 0; gets(s); for (i = 0; s[i] != '\0'; i++) n++; printf("长度=%d ", n); for (i = 0; i < n; i++) if (s[i] >= 'a' && s[i] <= 'z') s[i] = s[i] - 32; printf("%s ", s); return 0; } 【解析】评分要点:①输入用 gets,因为它只以回车结束、能读入带空格的整行;②求长度用循环数到 '\0' 为止,循环变量 i 从 0 起、条件写 s[i] != '\0',最后 n 就是字符个数;③大小写转换前必须先判断 s[i] 是否在小写字母区间,'a'~'z' 减 32 才是对应的大写字母,不判断就把空格、数字也减了 32,改出别的字符;④输出整个字符串用 %s 并写数组名。易错点:用 scanf("%s",s) 输入导致空格后的内容丢失;把长度当成数组长度 81 输出;转换时写成 s[i] = s[i] + 32(方向反了,越改越小);忘了 printf 的 %s 要写数组名而不是 s[i]。 2.编写一个C语言程序:从键盘输入两个字符串,比较两者内容的大小并输出“大于”“等于”或“小于”;再把第二个字符串连接到第一个字符串的后面并输出结果。 【答案】#include <stdio.h> #include <string.h> int main(void) { char s1[40], s2[20]; int cmp; gets(s1); gets(s2); cmp = strcmp(s1, s2); if (cmp > 0) printf("s1 大于 s2 "); else if (cmp == 0) printf("s1 等于 s2 "); else printf("s1 小于 s2 "); strcat(s1, s2); printf("%s ", s1); return 0; } 【解析】评分要点:①两个字符串都要用字符数组存放,第一个数组要留出连接后的足够空间(s1 长度 40 而 s2 只有 20);②比较内容必须调用 strcmp 并把函数值存到变量里,再分三种情况输出,不能直接用 if(s1>s2) 比较数组名;③strcmp 返回负值表示前一个小、0 表示相等、正值表示前一个大;④连接用 strcat,它把 s2 接到 s1 末尾并重新补上 '\0',之后用 %s 输出 s1。易错点:忘记写 #include <string.h> 导致函数未声明;用 gets 之外的方式输入含空格的字符串;把 strcat 写成 strcpy(结果只剩第二个串);连接时 s1 容量不足导致越界。 学科网(北京)股份有限公司 学科网(北京)股份有限公司 $ 编写说明:本专辑为山东省(春季高考)软件与应用技术类《C语言程序设计知识考纲讲练测》,严格依据山东省春季高考软件与应用技术类专业考试大纲(C语言程序设计部分)编写,精准对标考纲,兼顾考点覆盖与实战应用。每套讲练测提供讲义、课件、练习三大配套教学文件,贯穿九大核心环节:考点解读、思维导图、知识梳理、背诵环节、常考题、模拟题、课堂练习、课堂小结及课后测验,形成“讲-练-测-评”闭环式教学与复习逻辑,助力考生夯实基础、突破重难点。 山东省软件与应用技术类 《C语言程序设计知识考纲讲练测》 专题10 字符数组的定义及引用 班级      姓名      学号      成绩       一、单项选择题(本大题共15小题,每题4分,共60分) 1.关于字符数组,说法正确的是(  )。 A、char s[5]; 可以存放字符串 "hello" B、字符数组不能用来存放字符串 C、字符数组的每个元素占 1 个字节 D、字符数组的元素类型可以是 int 2.转义字符 '\0' 的 ASCII 值是(  )。 A、0 B、32 C、48 D、65 3.执行 char c='0'; 之后,c 的值与下列哪个相同(  )。 A、'\0' B、0 C、'a' D、48 4.若 char s[20]; 中存放字符串 "program",则 strlen(s) 的值是(  )。 A、7 B、6 C、8 D、20 5.用 %s 输入时,输入项写数组名而不加 & 的原因是(  )。 A、%s 格式符不要求地址 B、数组名本身就表示数组的首地址 C、加了 & 会改变数组的类型 D、数组名是常量,不能取地址 6.char s[40]; scanf("%s", s); 输入 Programming is fun 回车后,s 中的内容是(  )。 A、整个句子 B、Programming is C、空串 D、Programming 7.关于 gets 与 scanf 输入字符串的说法,正确的是(  )。 A、gets 以回车结束,可读入空格 B、两者都在遇到空格时结束输入 C、gets 不能读入字母 D、scanf 的 %s 可以读入整行句子 8.执行 char s1[20]="Hello", s2[]="World"; strcpy(s1,s2); 后 s1 的内容是(  )。 A、Hello B、World C、HelloWorld D、WorldHello 9.执行 char s1[20]="Hello", s2[]="World"; strcat(s1,s2); 后 strlen(s1) 的值是(  )。 A、5 B、11 C、10 D、20 10.执行 char s1[]="abc", s2[]="abd"; 之后,strcmp(s1,s2) 的函数值(  )。 A、大于 0 B、小于 0 C、等于 0 D、无法确定 11.若 strlen(s1) 与 strlen(s2) 相等,则两者的内容(  )。 A、一定相同 B、一定不同 C、无法比较 D、不一定相同 12.用 %s 输出一个不含 '\0' 的字符数组,输出结果是(  )。 A、只输出数组内的字符 B、编译报错 C、数组字符之后还跟着未知内容 D、什么也不输出 13.若 char s[10]="Hi\0There";,则 strlen(s) 的值是(  )。 A、3 B、2 C、8 D、9 14.下列程序段中,能把 s1 的内容完整复制到 s2 的是(  )。 A、s2 = s1; B、s2[10] = s1; C、for(i=0;i<=strlen(s1);i++) s2[i]=s1[i]; D、strcat(s2,s1); 15.下表列出4段定义及对应的输出效果,判断说法正确的是(  )。 序号 定义 puts 的输出 1 char s[10]="ab\0cd"; ab 2 char s[4]={'a','b','c','d'}; abcd 3 char s[]=""; (空行) 4 char s[6]="ab"; ab A、序号2 的输出内容可以确定 B、序号3 会报错 C、序号4 的 strlen(s) 是 6 D、序号1 只输出 ab 二、简答题(本大题共2小题,每题10分,共20分) 1.阅读下面的程序,写出程序运行后的输出结果,并回答问题。 #include <stdio.h> #include <string.h> int main(void) { char s[20] = "abCd1234"; int i, n = 0, d = 0; for (i = 0; s[i] != '\0'; i++) { if (s[i] >= 'a' && s[i] <= 'z') n++; if (s[i] >= '0' && s[i] <= '9') d++; } printf("%d,%d,%d ", strlen(s), n, d); return 0; } (1)循环条件 s[i] != '\0' 起到什么作用?(4分) (2)写出程序运行后的完整输出结果。(6分) 2.下面的程序想把字符串 hello 存进字符数组并输出,但存在四处错误,请指出错误之处、说明原因并给出正确写法。 #include <stdio.h> int main(void) { char s[5]; s = "hello"; scanf("%s", &s); printf("%c", s); return 0; } 三、案例分析题(本大题共1小题,每题10分,共10分) 1.以下程序的功能是:输入一行字符串(可含空格),统计其中大写字母、小写字母和数字字符的个数,并输出该字符串的长度。请在程序的下划线处填入正确的内容,使程序完整并能正确运行。 #include <stdio.h> #include <string.h> int main(void) { char s[81]; int i, up = 0, low = 0, d = 0; gets(s); for (i = 0; ____1____; i++) { if (s[i] >= 'A' && s[i] <= 'Z') ____2____; else if (s[i] >= 'a' && s[i] <= 'z') low++; else if (____3____) d++; } printf("长度=%d,大写=%d,小写=%d,数字=%d ", ____4____, up, low, d); return 0; } 四、综合应用题(本大题共2小题,每题5分,共10分) 1.编写一个C语言程序:从键盘输入一行字符串,先求出它的长度并输出,再把其中所有小写字母改成大写后输出(求长度用自己的循环实现,不用求串长函数)。 2.编写一个C语言程序:从键盘输入两个字符串,比较两者内容的大小并输出“大于”“等于”或“小于”;再把第二个字符串连接到第一个字符串的后面并输出结果。 学科网(北京)股份有限公司 学科网(北京)股份有限公司 $

资源预览图

专题10 字符数组的定义及引用(练习)-山东省(春季高考)软件与应用技术类《C语言程序设计知识》考纲讲练测-第1页
1
专题10 字符数组的定义及引用(练习)-山东省(春季高考)软件与应用技术类《C语言程序设计知识》考纲讲练测-第2页
2

由于学科网是一个信息分享及获取的平台,不确保部分用户上传资料的 来源及知识产权归属。如您发现相关资料侵犯您的合法权益,请联系学科网,我们核实后将及时进行处理。