内容正文:
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;
}
原创精品资源学科网独家享有版权,侵权必究!
学科网(北京)股份有限公司
$