c语言题求详解

#include<stdio.h>
main()
{
char str[ ]=”cdalb”;
abc(str);
puts(str);
}
abc(char *p)
{
int i,j;
for(i=j=0; *(p+i)!=’\0’; i++)
if(*(p+i)>=’d’)
{
*(p+j)=*(p+i);
j++;
}
*(p+j)=’\0’;
}
A.dalb B.cd C.dl D.c

建议程序改为:
#include<stdio.h>
void abc(char *p)
{
int i,j;
for(i=j=0; *(p+i)!='\0'; i++)
if(*(p+i)>='d')
{
*(p+j)=*(p+i);
j++;
}
*(p+j)='\0';
}
void main()
{
char str[ ]="cdalb";
abc(str);
puts(str);
}

答案:C
第一层for循环时i=j=0,p+i指向c,条件c!=\0成立,而且c比d小所以执行*(p+j)=’\0’,而这时j等于0所以字符串str的第0个位置被替换成\0,所以str变为\0dalb\0,然后i++,i变为1 。
第二层for循环时i=1,j=0,p+i指向,d,条件d!=\0成立,而且d等于d所以执行*(p+j)=*(p+i); j++;,而这时i等于1,j等于0,所以字符串str的第0个位置被替换成d,所以str变为ddalb\0,然后j++,i++,j变为1 ,i变为2。
第三层for循环时i=2,j=1,p+i指向a,条件a!=\0成立,而且a比d小所以执行*(p+j)=’\0’,而这时,j等于1,所以字符串str的第1个位置被替换成\0,所以str变为d\0alb\0,然后i++,i变为3 。
第四层for循环时i=3,j=1,p+i指向l,条件l!=\0成立,而且l大于d所以执行*(p+j)=*(p+i); j++;,而这时i等于3,j等于1,所以字符串str的第1个位置被替换成l,所以str变为dlalb\0,然后j++,i++,j变为2,i变为4。
第五层for循环时i=4,j=2,p+i指向b,条件b!=\0成立,而且b小于d,所以执行*(p+j)=’\0’,而这时j等于2所以字符串str的第2个位置被替换成\0,所以str变为dl\0lb\0,然后i++,i变为5 。
第六层for循环时i=5,j=2,p+i指向\0,条件\0!=\0不成立,所以for循环结束,函数返回到main函数执行puts(str);而puts函数输出是以\0或者\n(换行符)作为结束标志。所以当要就在屏幕输出str字符串时,就只输出第一个\0前面的字符。 所以在屏幕上输出dl。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2012-02-12
#include<stdio.h>
main()
{
char str[ ]=”cdalb”; //str中存入串”cdalb”
abc(str); //处理str串
puts(str); //输出处理后的串
}
abc(char *p)
{
int i,j;
for(i=j=0; *(p+i)!=’\0’; i++) //采用指针方式,遍历数组数据:”cdalb”,到串尾结束:*(p+i)!=’\0’
if(*(p+i)>=’d’) //如果当前位置的数据比'd'大,则将数据写入新的串,新串与原串的空间起始位置相同。
{
*(p+j)=*(p+i); //赋值
j++;
}
*(p+j)=’\0’;//新串尾赋值为0,字符串结束标志。
}
输出结果:dl本回答被网友采纳
第2个回答  2012-02-13
选择C
这其实是一个把该数组中元素为d或在d后面的提取出来, if(*(p+i)>=’d’)
{
*(p+j)=*(p+i);将大于d 的元素提取出来 j++;
}
*(p+j)=’\0’;将小于的删除
相似回答