浙江省计算机二级C语言的题目求过程详细解析,不要答案

【程序】#include<stdio.h>main(){inti,j;charch,*p1,*p2,*s[4]={”tree”,“flower”,“grass”,“gar... 【程序】
#include <stdio.h>
main()
{ int i,j;
char ch, *p1, *p2, *s[4]={”tree”,“flower”,“grass”,“garden”};
for(i = 0; i < 4; i++) {
p2 = s[i];
p1 = p2 + i;
while(*p1 != ’\0’){
*p2 = *p1;
p1++, p2++;
}
*p2 = ’\0’;
}
for(i = 0; i < 4; i++)
printf("%s\n",s[i]);
}
【问题】
(21) 程序运行时,第1行输出 (21) 。
A、ree B、ss C、tree D、e
(22) 程序运行时,第2行输出 (22) 。
A、flower B、ower C、wer D、lower
(23) 程序运行时,第3行输出 (23) 。
A、grass B、ss C、rass D、ass
(24) 程序运行时,第4行输出 (24) 。
A、en B、arden C、den D、garden
这是2010年下半年的真题最后一道选择题
展开
 我来答
褔耶权靠饭
2012-10-31
知道答主
回答量:9
采纳率:0%
帮助的人:9.5万
展开全部

我分析的答案是:CDDC。

首先要明白的是字符指针数组*s[4]它指向的是这四个字符串的首地址,

比如,S[0]存放的是第一字符串"tree"的首字符‘t’的地址,要明白的是在内存中

它们是这样存储的:

S[0]指向‘t’字符的首地址,也就是说S[0]存储的是字符‘t’的内存地址。但是不要

忘记了字符串最后面还会自动的加上字符串结束符‘\0’的。如果对于这块不明白的

还可以早C语言的书看看这一块的内容。

分析程序:

(1) i = 0; p2=S[0]; p1 = p2 + 0; 

这里说明字符指针p1,p2都指向的是字符‘t’,*p1=*p2='t'。

执行while循环,循环条件满足,*p2=*p1,这里就是把*p1的值赋值给*p2,因为他们都是

指向字符‘t’所以不改变它的值。然后p1++,p2++,意味着p1、p2都指向下一个字符‘r’

仍然没有改变。依次类推下去p1、p2都指向字符‘\0’时while循环结束,接着执行

*p2=‘\0’,然而*p2本来就等于‘\0’,所以还是不变。

也就是说i = 0for循环结束一次循环,字符串“tree”没有改变。

(2) i = 1;p2=S[1]; p1 = p2 + 1; 

 

 

 

执行while循环,第一次循环很明显的*p2 = *p1,因为*p1='l',所以*p2='l',也就是内存中‘f’就改变成了‘l’。执行p1++,p2++内存中的变化如下图:

类似的一次交换赋值,指针移动到下一位最终while循环结束。

还有一个很重要的地方需要提示一下,while循环结束但是*p2='\0'

,p2指向的值会被赋值为'\0'。p1 = p2 + i;p1指针的移动也要注意

p1到底是指向了那个字符。

 

C语言中,字符串中有‘\0’,则输出字符时它只会输出'\0'的前面字符。

比如:字符串“ass\0s\0”,则输出该字符串时结果为“ass”。

 

(3)i = 2 、3这里就不分析了,同上的分析思路。

蓝鲸智能科技
2024-11-21 广告
您好,我公司自主研发的“机动车驾驶人理论考试管理系统”,具有进/出考场考生身份确认应用场景,能够实现认证比对、约考信息查询和考试状态查询的功能;具有理论考试应用场景,具有考生签到和随机分配考台等功能,我司理论考试系统全面适配信创软硬件,并持... 点击进入详情页
本回答由蓝鲸智能科技提供
f4685461
2012-10-31 · TA获得超过630个赞
知道小有建树答主
回答量:156
采纳率:0%
帮助的人:182万
展开全部
楼下的认为 p2 在被p1 赋值的时候有问题 p2指向的是常量的字符串,不可修改。s[i]指向的是一个静态字符串, 静态字符串是不可修改的。。。

不过按照原题的意思 输出应该是 0的时候出去全字符 1的时候从第二位即下表为1的字符开始输出到最后 2、3 依次类推。
因为p1在指向s[i]后 地址+i 赋值给p2 p2的地址就是每个字符串的地址。

中间这段话是有前提的,这段程序不成立
s改为2维数组即可
更多追问追答
追问
可以再详细些为我解释一下这个循环里的内容吗?比如说,i=0的时候,p2=s[0]等于什么,是tree吗?还有像p1要是+1了之后对字符串有什么改变?我想劳烦你以i=0时候为例,说下接下来每一句语句,谢谢
追答
*s[4]={”tree”,“flower”,“grass”,“garden”};

s[0] : tree
s[1]: flower
..
s[3]: garden

i=0:
p2 = s[0];// p2: tree
p1 = p2 + 0; //p1 : tree

while(*p1 != ’\0’){
*p2 = *p1;
p1++, p2++;
}//这个循环就是吧p1中的内容赋值给p2 不详解

i=1:
p2 = s[1];// p2: flower
p1 = p2 + 1; //p1 : lower 因为p2的首地址指向的是 flower 中 f的位置 p2+1 就指向 l 的位置了

后面赋值

i=2,i=3 的时候和i=1的意思是一样的 每次地址向后位移 位移的量就是 i

不过这个程度的 p2 的值是不可用修改的 我前面说过了 你明白就行
本回答被提问者和网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友3038d88
2012-10-31 · TA获得超过1097个赞
知道小有建树答主
回答量:1670
采纳率:0%
帮助的人:1196万
展开全部
我觉得 就是按顺序 s[4] 数组里的顺序 输出的.
中间操作跟 对s[4] 没影响.

楼下怎么看?
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
牛郎帮
2012-10-31
知道答主
回答量:41
采纳率:0%
帮助的人:12.9万
展开全部
楼主的程序有很多错误 先改改吧
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式