求 c语言程序题详细解释,越详细越好,拜谢啦

6阅读下列程序并回答问题,在每小题提供的若干可选答案中,挑选一个正确答案。
【程序】
#include <stdio.h>
main()
{
int i, j;
char ch, *p1, *p2, *s[4]={"four","hello","peak","apple"};
for(i = 0; i < 4; i++){
p1 = p2 = s[i];
ch = *(p1 + i);
while(*p1 != '\0'){
if(*p1 != ch){
*p2 = *p1;
p2++;
}
p1++;
}
*p2 = '\0';
}
for(i = 0; i < 4; i++)
printf("%s\n", s[i]);
}
【问题】
(21) 程序运行时,第1行输出 (21) 。
A、our B、four C、fur D、fou
(22) 程序运行时,第2行输出 (22) 。
A、ello B、hllo C、heo D、hell
(23) 程序运行时,第3行输出 (23) 。
A、peak B、eak C、pek D、pak
(24) 程序运行时,第4行输出 (24) 。
A、pple B、apple C、ale D、appe

这题虽然没有语法错误,但是运行时会出错。P1,P2指向常量,不能对常量进行修改。

答案是21.A 22.B 23.C 24.D

这道题本身代码就有问题,我修改成了这样:
#include <stdio.h>
#include <stdlib.h>
int main()
{
int i, j;
char ch, *p1, *p2[4];
char *s[4]={"four","hello","peak","apple"};
for(int t = 0; t < 4; t++)
{
p2[t] = (char*)malloc(6*sizeof(char));
}
for(i = 0; i < 4; i++){
p1 = s[i];
ch = *(p1 + i);
int counter = 0;
while(*p1 != '\0'){
if(*p1 != ch){
*(p2[i]+counter) = *p1;
counter++;
}
p1++;
}
*(p2[i]+counter) = '\0';
}
for(i = 0; i < 4; i++)
printf("%s\n", p2[i]);
return 0;
}

你运行看看。

具体解释:
for循环中,
将第1个单词four的第一个字母保存在ch变量中,
将第2个单词hello的第二个字母保存在ch变量中,以此类推。
然后,原有数组拷贝到新的指针数组p2当中去,拷贝的时候,遇到ch变量存储的字符就跳过。
所以,four少了第一个字母f, hello少了第二个字母e, peak少了第三个字母a, apple少了第四个字母l追问

为什么在for循环中第一个字母会保存在ch变量中呢

追答

for(i = 0; i < 4; i++){
p1 = s[i];
ch = *(p1 + i);

for循环一共循环四次,i分别等于0,1,2,3。
第一次循环i=0; p1=s[0],所以p1指向数组的第一个元素,也就是第一个字符串four,ch=*(p1+0),p1+0指向第一个字母f,所以ch保存的是f。
第二次循环i=1; p1=s[1],所以p1指向数组的第二个元素,也就是第二个字符串hello,ch=*(p1+1),p1+1指向第二个字母e,所以ch保存的是e。
第三次循环i=2; p1=s[2],所以p1指向数组的第三个元素,也就是第三个字符串peak,ch=*(p1+2),p1+2指向第三个字母a,所以ch保存的是a。
第四次循环i=3; p1=s[3],所以p1指向数组的第四个元素,也就是第四个字符串apple,ch=*(p1+3),p1+3指向第四个字母l,所以ch保存的是l。

温馨提示:内容为网友见解,仅供参考
第1个回答  2013-06-30
此题哪一行也不会有输出,编译可过,但执行会报错。因为*s[4]={"four","hello","peak","apple"};声明了一个指针数组s[4],它的每一个指针都被初始化为指向{}中对应的一个“常”字符串,这就意味着这4个指针指向的字符串不能被写操作,而代码中的*p2 = *p1;和*p2 = '\0';违反了这一规则……
第2个回答  2013-06-30
21.A
22.B
23.C
24.D
仅供参考,详细吧~追问

我是想问全部题目的详细解释

相似回答