第8章 第4节:字符串与指针(练习)-《C语言程序设计》(电子工业出版社)上好课

2026-06-29
| 2份
| 35页
| 40人阅读
| 0人下载

内容正文:

8.4节:字符串与指针 一、单项选择题 1.已知 char str[] = "hello"; char *p = str;,通过指针访问第 3 个字符 'l',正确表达式是( ) A. p+2 B. *(p+2) C. p[3] D. *p+2 2.定义 char *p = "apple";,执行 p++ 后,*p 的结果为() A. 'a' B. 'p' C. 'l' D. 字符串结束符 3.关于字符指针遍历字符串循环条件 while(*p != '\0'),说法正确的是() A. p 存储字符串结束符 B. *p 取出指针当前指向的字符 C. p 可以直接和 '\0' 比较 D. 循环结束后 p 指向字符串首字符 4.设有语句:char str[] = "test"; char *p = str; 下列不能输出字符's' 的指针写法是() A. *(p+2) B. p[2] C. *(str+2) D. p+2 5.已知 char *p = "banana";,表达式 p[4] 等价于() A. p+4 B. *(p+4) C. *p+4 D. &p[4] 6.设有语句:char str[] = "cat"; char *q = str; 若要通过指针修改数组中字符 'a' 为 'A',正确语句是() A. *(q+1) = 'A'; B. q+1 = 'A'; C. *q+1 = 'A'; D. q[1] = "A"; 7.用指针循环输出全部字符串,代码逻辑正确的是() A. char *p="hi"; while (p){putchar (*p); p++;} B. char *p="hi"; while (*p){putchar (*p); p++;} C. char str []="hi"; while (str){putchar (*str); str++;} D. char str []="hi"; while (str [0]){putchar (str); str++;} 8.设有定义:char *p = "orange"; 执行 p = p + 3,此时*p对应的字符是() A. 'o' B. 'n' C. 'g' D. 'e' 9.已知 char arr[] = "rose"; char *p = arr; 表达式 *(arr + 0) 等价于() A. p B. *p C. arr+0 D. &p [0] 10.知 char s[] = "bird"; char *p = s; 下列指针写法不能修改数组字符的是() A. p [1] = 'I'; B. *(p+2) = 'R'; C. p+1 = 'I'; D. *(s+3) = 'D'; 二、填空题。 1.已知 char s[]="flower"; char *p=s;,表达式 *(p+4) 对应的字符是___________。 2.循环遍历字符串 char *p="cloud";,循环终止判断条件应写为 while (________)。 3.已知 char *p="mango";,语句 p[3] 等价于指针表达式___________。 4.设有语句:char str[]="grape"; char *q=str;,修改第三个字符 'a' 为 'A',合法指针赋值语句为________ = 'A';。 5.设有语句:char str[] = "olive"; char *p = str; 先后执行 p++; p += 2;,最终指针指向的下标是___________。 6.设有语句:char *s = "daisy";,执行 s += 1 后,再执行 s -= 1,指针最终指向下标___________。 7.字符串char *p="grape";,循环int cnt=0;while(*p){cnt++;p++;}执行完毕后,变量 cnt 的数值为___________。 8.设有语句:char *s="peach";int len=0;for(;*s;s++,len++); 循环结束后 len=___________。 9.设有语句:char str[]="cherry"; char *p=str;,字符串总有效字符 6 个,执行p=p+6,此时*p的 ASCII 码数值为___________。 10.设有语句:char arr[]="lotus"; char *p=arr; 执行p+=2后,表达式*(p+2)对应原始数组下标___________。 三、阅读程序题。 1.写出下列程序段的输出结果:________________。 #include <stdio.h> int main() { char *s = "pear"; int i = 0; while(*s != '\0') { if(i % 2 == 0) putchar(*s); s++; i++; } return 0; } 2.写出下列程序段的输出结果:________________。 #include <stdio.h> int main() { char str[] = "iris"; char *p = str; while(*p) { if(*p > 'm') putchar(*p); p++; } return 0; } 3.写出下列程序段的输出结果:________________。 #include <stdio.h> int main() { char *ptr = "orange"; int num = 0; while(*ptr != '\0') { num = num + (*ptr - '0'); ptr++; } printf("%d", num); return 0; } 4.写出下列程序段的输出结果:________________。 #include <stdio.h> int main() { char str[] = "violet"; char *p = str; p++; *(p+2) = 'O'; printf("%s", str); return 0; } 5.写出下列程序段的输出结果:________________。 #include <stdio.h> int main() { char buf[] = "abacabc"; char *p = buf; int count = 0; while(*p != '\0') { if(*p == 'a') count++; p++; } printf("count=%d", count); return 0; } 6.写出下列程序段的输出结果:________________。 #include <stdio.h> int main() { char str[] = "spring"; char *p = str; p = p + 2; while(*p) { if(*p < 'n') putchar(*p); p++; } return 0; } 7.写出下列程序段的输出结果:________________。 #include <stdio.h> int main() { char arr[] = "0123456"; char *q = arr; int sum = 0; for(; *q; q++) { if((*q - '0') % 2 == 0) sum = sum + (*q - '0'); } printf("%d", sum); return 0; } 8.写出下列程序段的输出结果:________________。 #include <stdio.h> int main() { char str[] = "testabc"; char *p = str; int flag = 0; while(*p) { if(*p == 'b') flag = 1; if(flag == 1) putchar(*p); p++; } return 0; } 9.写出下列程序段的输出结果:________________。 #include <stdio.h> int main() { char str[] = "tornado"; char *left = str; char *right = str; while(*right != '\0') right++; right--; while(left < right) { putchar(*left); putchar(*right); left++; right--; } return 0; } 10.写出下列程序段的输出结果:________________。 #include <stdio.h> int main() { char str[] = "butterfly"; char *p = str; char *split = NULL; while(*p != '\0') { if(*p == 'f') { split = p; break; } p++; } *split = '\0'; printf("%s", str); *split = 'f'; printf("%s", split); return 0; } 四、程序填空题(根据题意,将空缺的语句补上) 1.下列程序的功能是:给定一串小写英文字符,用指针遍历,下标偶数位置原样输出小写,下标奇数位置转大写输出,全程只用指针操作,不使用数组下标 []。 #include <stdio.h> int main() { char str[] = "watermelon"; char *p = str; int idx = 0; while (________①______) { if (idx % 2 == 0) { putchar(*p); } else { putchar(______②______); } ______③______ idx++; } return 0; } 2.下列程序的功能是:通过指针计算字符串中点,将字符串切分为前半、后半两段,用指针循环依次打印「后半段 + 前半段」,实现字符串旋转效果。 #include <stdio.h> int main() { char str[] = "orange"; char *p = str; char *mid = str; int len = 0; while (*p) { len++; p++; } mid = _______①______ p = mid; while (*p) { putchar(*p); p++; } ______②______ while (p < mid) { putchar(________③______); p++; } return 0; } 3.下列程序的功能是:对小写字母字符串加密:每个字符 ASCII 码 + 3(a→d,b→e,…z→c),使用指针原地修改数组内容,最后输出加密后的完整字符串。 #include <stdio.h> int main() { char str[] = "xyzabc"; char *p = str; while (*p != '\0') { if (_________①________) { if (________②______) { *p = _______③______ } else { *p = *p + 3; } } p++; } printf("加密结果:%s", str); return 0; } 4.下列程序的功能是:给定存在相邻重复字符的字符串,用指针遍历,仅保留第一次出现的字符,删除相邻重复项,输出去重后的字符串。 #include <stdio.h> int main() { char buf[] = "aabbccddeeffg"; char *read = buf; char *write = buf; while (________①_______) { if (write == buf || ________②________) { *write = *read; write++; } read++; } _______③_______ printf("去重结果:%s", buf); return 0; } 5.下列程序的功能是:固定查找字符 'm',用指针遍历字符串,每找到一次就输出该字符对应的下标数字,若不存在则输出提示文字。 #include <stdio.h> int main() { char str[] = "mangoalmond"; char *p = str; int pos = 0; int flag = 0; printf("字符m出现的下标:"); while (*p != '\0') { if (_______①_______) { printf("%d ", pos); _______②_______ } p++; pos++; } if (flag == 0) { printf("无"); } return 0; } 五、编程题。 1. 编写程序:使用左右双指针,原地交换字符数组首尾对应字符,实现整串反转,不额外开辟数组存储。 2.编写程序:指针遍历混合大小写的字符串,分别统计大写英文字母、小写英文字母的个数,最后分两行打印两个计数结果。 3.编写程序:利用指针偏移遍历,只取下标 1、3、5…… 位置的字符,存入原数组前端,末尾添加结束符,输出提取后的新字符串。 4.编写程序:接收用户输入纯字母字符串,双指针判断正序、逆序字符是否全部相等,输出是 / 不是回文的判断结果。 5.编写程序:用户输入字母加数字混合字符串,使用双指针原地拆分,数组前半段保存全部字母、后半段保存全部数字,分别打印字母部分与数字部分,全程只用指针操作,不使用数组下标。 原创精品资源学科网独家享有版权,侵权必究! 学科网(北京)股份有限公司 $ 8.4节:字符串与指针 一、单项选择题 1.已知 char str[] = "hello"; char *p = str;,通过指针访问第 3 个字符 'l',正确表达式是( ) A. p+2 B. *(p+2) C. p[3] D. *p+2 【答案】B 【解析】p 保存字符串首地址,p+2 向后偏移 2 个字符地址,*(p+2)解引用取出下标 2 的字符 'l';A 只是地址、C 取到 'o'、D 是首字符 ASCII 值 + 2。 2.定义 char *p = "apple";,执行 p++ 后,*p 的结果为( ) A. 'a' B. 'p' C. 'l' D. 字符串结束符 【答案】B 【解析】初始 p 指向首字符 'a',p++让指针向后移动 1 位,指向第二个字符 'p',解引用得到 'p'。 3.关于字符指针遍历字符串循环条件 while(*p != '\0'),说法正确的是( ) A. p 存储字符串结束符 B. *p 取出指针当前指向的字符 C. p 可以直接和 '\0' 比较 D. 循环结束后 p 指向字符串首字符 【答案】B 【解析】*p是解引用操作,读取指针当前位置的字符;p 是地址不能直接与字符'\0'比较,循环结束时 p 指向'\0'。 4.设有语句:char str[] = "test"; char *p = str; 下列不能输出字符's' 的指针写法是( ) A. *(p+2) B. p[2] C. *(str+2) D. p+2 【答案】D 【解析】p+2 仅代表字符's' 的内存地址,不是字符;其余三个表达式均可取出下标 2 的字符's'。 5.已知 char *p = "banana";,表达式 p[4] 等价于( ) A. p+4 B. *(p+4) C. *p+4 D. &p[4] 【答案】B 【解析】指针下标语法 p[i] 本质等价于 *(p+i),是指针操作字符串的通用写法。 6.设有语句:char str[] = "cat"; char *q = str; 若要通过指针修改数组中字符 'a' 为 'A',正确语句是( ) A. *(q+1) = 'A'; B. q+1 = 'A'; C. *q+1 = 'A'; D. q[1] = "A"; 【答案】A 【解析】q+1是 'a' 的地址,*(q+1)代表该地址存储的字符,可赋值修改;B 地址不能赋值、C 运算顺序错误、D 右侧是字符串常量不匹配。 7.用指针循环输出全部字符串,代码逻辑正确的是( ) A. char *p="hi"; while (p){putchar (*p); p++;} B. char *p="hi"; while (*p){putchar (*p); p++;} C. char str []="hi"; while (str){putchar (*str); str++;} D. char str []="hi"; while (str [0]){putchar (str); str++;} 【答案】B 【解析】while(*p)判断当前指针指向字符是否不为结束符,配合p++逐字符遍历;A 直接判断地址、C 数组名不能自增、D 输出地址。 8.设有定义:char *p = "orange"; 执行 p = p + 3,此时*p对应的字符是( ) A. 'o' B. 'n' C. 'g' D. 'e' 【答案】B 【解析】原字符串下标 0:o、1:r、2:a、3:n;指针向后偏移 3 位,指向字符 'n'。 9.已知 char arr[] = "rose"; char *p = arr; 表达式 *(arr + 0) 等价于( ) A. p B. *p C. arr+0 D. &p [0] 【答案】B 【解析】arr+0是首字符地址,解引用*(arr+0)取出首字符 'r',等价于*p。 10.知 char s[] = "bird"; char *p = s; 下列指针写法不能修改数组字符的是( ) A. p [1] = 'I'; B. *(p+2) = 'R'; C. p+1 = 'I'; D. *(s+3) = 'D'; 【答案】C 【解析】p+1 是地址常量,无法被赋值;其余表达式均代表可修改的数组字符。 二、填空题。 1.已知 char s[]="flower"; char *p=s;,表达式 *(p+4) 对应的字符是___________。 【答案】e 【解析】字符串下标 0-f、1-l、2-o、3-w、4-e,p+4 偏移 4 位,解引用取字符 e。 2.循环遍历字符串 char *p="cloud";,循环终止判断条件应写为 while (________)。 【答案】p != '\0'(或p) 【解析】*p 取出当前指针指向字符,判断是否到达字符串结束标记。 3.已知 char *p="mango";,语句 p[3] 等价于指针表达式___________。 【答案】*(p+3) 【解析】指针支持下标写法,底层逻辑和指针偏移解引用完全相同。 4.设有语句:char str[]="grape"; char *q=str;,修改第三个字符 'a' 为 'A',合法指针赋值语句为________ = 'A';。 【答案】*(q+2) 【解析】q+2 是 'a' 的地址,解引用后代表该存储单元,可直接赋值修改。 5.设有语句:char str[] = "olive"; char *p = str; 先后执行 p++; p += 2;,最终指针指向的下标是___________。 【答案】3 【解析】初始 0,p++ 到 1,再加 2,1+2=3。 6.设有语句:char *s = "daisy";,执行 s += 1 后,再执行 s -= 1,指针最终指向下标___________。 【答案】0 【解析】先偏移 1 到下标 1,再减 1 回到初始下标 0。 7.字符串char *p="grape";,循环int cnt=0;while(*p){cnt++;p++;}执行完毕后,变量 cnt 的数值为___________。 【答案】5 【解析】grape 有 g/r/a/p/e 共 5 个有效字符,循环每读取一个字符 cnt 自增 1,结束时 cnt=5。 8.设有语句:char *s="peach";int len=0;for(;*s;s++,len++); 循环结束后 len=___________。 【答案】5 【解析】peach 共 p/e/a/c/h 5 个有效字符,循环执行 5 次 len 自增。 9.设有语句:char str[]="cherry"; char *p=str;,字符串总有效字符 6 个,执行p=p+6,此时*p的 ASCII 码数值为___________。 【答案】0 【解析】偏移 6 位到达末尾结束符'\0','\0'ASCII 值等于 0。 10.设有语句:char arr[]="lotus"; char *p=arr; 执行p+=2后,表达式*(p+2)对应原始数组下标___________。 【答案】4 【解析】p 偏移 2,再加 2,总偏移 2+2=4。 三、阅读程序题。 1.写出下列程序段的输出结果:________________。 #include <stdio.h> int main() { char *s = "pear"; int i = 0; while(*s != '\0') { if(i % 2 == 0) putchar(*s); s++; i++; } return 0; } 【答案】pa 2.写出下列程序段的输出结果:________________。 #include <stdio.h> int main() { char str[] = "iris"; char *p = str; while(*p) { if(*p > 'm') putchar(*p); p++; } return 0; } 【答案】rs 3.写出下列程序段的输出结果:________________。 #include <stdio.h> int main() { char *ptr = "orange"; int num = 0; while(*ptr != '\0') { num = num + (*ptr - '0'); ptr++; } printf("%d", num); return 0; } 【答案】348 4.写出下列程序段的输出结果:________________。 #include <stdio.h> int main() { char str[] = "violet"; char *p = str; p++; *(p+2) = 'O'; printf("%s", str); return 0; } 【答案】vioOet 5.写出下列程序段的输出结果:________________。 #include <stdio.h> int main() { char buf[] = "abacabc"; char *p = buf; int count = 0; while(*p != '\0') { if(*p == 'a') count++; p++; } printf("count=%d", count); return 0; } 【答案】count=3 6.写出下列程序段的输出结果:________________。 #include <stdio.h> int main() { char str[] = "spring"; char *p = str; p = p + 2; while(*p) { if(*p < 'n') putchar(*p); p++; } return 0; } 【答案】ig 7.写出下列程序段的输出结果:________________。 #include <stdio.h> int main() { char arr[] = "0123456"; char *q = arr; int sum = 0; for(; *q; q++) { if((*q - '0') % 2 == 0) sum = sum + (*q - '0'); } printf("%d", sum); return 0; } 【答案】12 8.写出下列程序段的输出结果:________________。 #include <stdio.h> int main() { char str[] = "testabc"; char *p = str; int flag = 0; while(*p) { if(*p == 'b') flag = 1; if(flag == 1) putchar(*p); p++; } return 0; } 【答案】bc 9.写出下列程序段的输出结果:________________。 #include <stdio.h> int main() { char str[] = "tornado"; char *left = str; char *right = str; while(*right != '\0') right++; right--; while(left < right) { putchar(*left); putchar(*right); left++; right--; } return 0; } 【答案】toodra 10.写出下列程序段的输出结果:________________。 #include <stdio.h> int main() { char str[] = "butterfly"; char *p = str; char *split = NULL; while(*p != '\0') { if(*p == 'f') { split = p; break; } p++; } *split = '\0'; printf("%s", str); *split = 'f'; printf("%s", split); return 0; } 【答案】butterfly 四、程序填空题(根据题意,将空缺的语句补上) 1.下列程序的功能是:给定一串小写英文字符,用指针遍历,下标偶数位置原样输出小写,下标奇数位置转大写输出,全程只用指针操作,不使用数组下标 []。 #include <stdio.h> int main() { char str[] = "watermelon"; char *p = str; int idx = 0; while (________①______) { if (idx % 2 == 0) { putchar(*p); } else { putchar(______②______); } ______③______ idx++; } return 0; } 【答案】①*p != '\0' ②*p - 32 ③p++; 2.下列程序的功能是:通过指针计算字符串中点,将字符串切分为前半、后半两段,用指针循环依次打印「后半段 + 前半段」,实现字符串旋转效果。 #include <stdio.h> int main() { char str[] = "orange"; char *p = str; char *mid = str; int len = 0; while (*p) { len++; p++; } mid = _______①______ p = mid; while (*p) { putchar(*p); p++; } ______②______ while (p < mid) { putchar(________③______); p++; } return 0; } 【答案】①str + len / 2; ②p = str; ③*p 3.下列程序的功能是:对小写字母字符串加密:每个字符 ASCII 码 + 3(a→d,b→e,…z→c),使用指针原地修改数组内容,最后输出加密后的完整字符串。 #include <stdio.h> int main() { char str[] = "xyzabc"; char *p = str; while (*p != '\0') { if (_________①________) { if (________②______) { *p = _______③______ } else { *p = *p + 3; } } p++; } printf("加密结果:%s", str); return 0; } 【答案】①*p >= 'a' && *p <= 'z' ②*p + 3 > 'z' ③*p + 3 - 26; 4.下列程序的功能是:给定存在相邻重复字符的字符串,用指针遍历,仅保留第一次出现的字符,删除相邻重复项,输出去重后的字符串。 #include <stdio.h> int main() { char buf[] = "aabbccddeeffg"; char *read = buf; char *write = buf; while (________①_______) { if (write == buf || ________②________) { *write = *read; write++; } read++; } _______③_______ printf("去重结果:%s", buf); return 0; } 【答案】①*read != '\0' ②*read != *(write - 1) ③*write = '\0'; 5.下列程序的功能是:固定查找字符 'm',用指针遍历字符串,每找到一次就输出该字符对应的下标数字,若不存在则输出提示文字。 #include <stdio.h> int main() { char str[] = "mangoalmond"; char *p = str; int pos = 0; int flag = 0; printf("字符m出现的下标:"); while (*p != '\0') { if (_______①_______) { printf("%d ", pos); _______②_______ } p++; pos++; } if (flag == 0) { printf("无"); } return 0; } 【答案】①*p == 'm' ②flag = 1; 五、编程题。 1. 编写程序:使用左右双指针,原地交换字符数组首尾对应字符,实现整串反转,不额外开辟数组存储。 【参考代码】 #include <stdio.h> int main() { char word[] = "sunflower"; char *left = word; char *right = word; char temp; while (*right) { right++; } right--; while (left < right) { temp = *left; *left = *right; *right = temp; left++; right--; } printf("反转字符串:%s", word); return 0; } 2.编写程序:指针遍历混合大小写的字符串,分别统计大写英文字母、小写英文字母的个数,最后分两行打印两个计数结果。 【参考代码】 #include <stdio.h> int main() { char str[] = "BananaApplePEACH"; char *p = str; int low = 0, up = 0; while (*p != '\0') { if (*p >= 'a' && *p <= 'z') { low++; } else if (*p >= 'A' && *p <= 'Z') { up++; } p++; } printf("小写字母总数:%d ", low); printf("大写字母总数:%d", up); return 0; } 3.编写程序:利用指针偏移遍历,只取下标 1、3、5…… 位置的字符,存入原数组前端,末尾添加结束符,输出提取后的新字符串。 【参考代码】 #include <stdio.h> int main() { char str[] = "blueberry"; char *read = str; char *write = str; int idx = 0; while (*read != '\0') { if (idx % 2 == 1) { *write = *read; write++; } read++; idx++; } *write = '\0'; printf("奇数下标字符:%s", str); return 0; } 4.编写程序:接收用户输入纯字母字符串,双指针判断正序、逆序字符是否全部相等,输出是 / 不是回文的判断结果。 【参考代码】 #include <stdio.h> int main() { char buf[100]; char *left, *right; int isPal = 1; printf("请输入一串纯字母:"); gets(buf); left = buf; right = buf; while (*right) { right++; } right--; while (left < right) { if (*left != *right) { isPal = 0; break; } left++; right--; } if (isPal == 1) { printf("该字符串是回文字符串"); } else { printf("该字符串不是回文字符串"); } return 0; } 5.编写程序:用户输入字母加数字混合字符串,使用双指针原地拆分,数组前半段保存全部字母、后半段保存全部数字,分别打印字母部分与数字部分,全程只用指针操作,不使用数组下标。 【参考代码】 #include <stdio.h> int main() { char str[100]; char temp[100]; char *p = str; char *letter = str; char *num = temp; printf("请输入混合字母数字的字符串:"); gets(str); while(*p != '\0') { if((*p >= 'a' && *p <= 'z') || (*p >= 'A' && *p <= 'Z')) { *letter = *p; letter++; } else if(*p >= '0' && *p <= '9') { *num = *p; num++; } p++; } *letter = '\0'; *num = '\0'; printf("提取字母:%s ", str); printf("提取数字:%s", temp); return 0; } 原创精品资源学科网独家享有版权,侵权必究! 学科网(北京)股份有限公司 $

资源预览图

第8章 第4节:字符串与指针(练习)-《C语言程序设计》(电子工业出版社)上好课
1
第8章 第4节:字符串与指针(练习)-《C语言程序设计》(电子工业出版社)上好课
2
第8章 第4节:字符串与指针(练习)-《C语言程序设计》(电子工业出版社)上好课
3
所属专辑
由于学科网是一个信息分享及获取的平台,不确保部分用户上传资料的 来源及知识产权归属。如您发现相关资料侵犯您的合法权益,请联系学科网,我们核实后将及时进行处理。