黑马程序员技术交流社区

标题: 选择题我可以排除错误,但我不知道错误选项为什么错了 [打印本页]

作者: 剑气近    时间: 2014-6-15 21:24
标题: 选择题我可以排除错误,但我不知道错误选项为什么错了
本帖最后由 剑气近 于 2014-6-18 23:32 编辑

1.若有以下说明语句,错误使用strcpy函数的是(c)
char *str1="we",str2[8],str3[8]="how",*str4,str5[3]="you";
A.strcpy(str2,str1)  B.strcpy(str3,str1)  C.strcpy(str4,str5)  D.strcpy(str5,str1)
2.若有以下说明和语句,则输出结果是(b)【尤其这个】
char *sp="\t\v\\\0will\n";
printf("%d",strlen(sp));
A.14 B.3 C.9 D.10
3.这个题解释原因
程序代码:
#include<stdio.h>
void main()
{ void invert(char *perv,char *endp);
  char string[80]="change",*p2,*p1;
  p1=p2=string;
  while(*p2)p2++;
  p2--;
  invert(p1,p2);
  printf("\n%s",p1);
}
void invert(char *perv,char *endp)
{ static char temp;
   printf("%c",endp[0]);
  if(perv<endp)
  { temp=*perv;
    *perv=*endp;
    *endp=temp;
    invert(perv+1,endp-1);
  }
}

结果是:
egnn
egnahc
作者: huangqiwa    时间: 2014-6-15 22:14
楼主你好
先说第一题:C,因为目标地址str4没有足够的空间来存放str5的内容
第二题:B,因为char *sp="\t\v\\\0will\n"; \t转义算一个字符,\v转义算第二个字符 \\算第三个字符,然后遇到了\0就结束了!所以只有3个字符!
第三题:我不知道这个题是什么意思,但是题目还是看懂了,这里用了一个递归!
  1. #include<stdio.h>
  2. void main()
  3. { void invert(char *perv,char *endp);
  4.   char string[80]="change",*p2,*p1;//创建一个字符数组,初始化为change,同事定义两个指针
  5.   p1=p2=string;//将两个指针都指向数组首地址
  6.   while(*p2)p2++;//将P2指向字符串的结尾NULL
  7.   p2--;//然后后退一个指向最后一个字符
  8.   invert(p1,p2);//进行字符对换,这个函数的功能就是如果p1指向的字符小于p2指向的字符,就将2个字符兑换
  9.   printf("\n%s",p1);
  10. }
  11. void invert(char *perv,char *endp)
  12. { static char temp;
  13.    printf("%c",endp[0]);//这里每次打印的是p2指向的字符 因此就是egnn
  14.   if(perv<endp)
  15.   { temp=*perv;
  16.     *perv=*endp;
  17.     *endp=temp;
  18.     invert(perv+1,endp-1);//因此最后change 第一次比较 c<e 因此 变成ehangc
  19. //第二次比较h<g 变成eganhc 第三次比较 a<n编程egnahc 第四次发现p2指向是n 已经大于p1指向的字符a
  20. 所以函数不进行比较,递归结束!
  21.   }
  22. }
复制代码



作者: 剑气近    时间: 2014-6-15 22:43
huangqiwa 发表于 2014-6-15 22:14
楼主你好
先说第一题:C,因为目标地址str4没有足够的空间来存放str5的内容
第二题:B,因为char *sp="\t\v ...

1.如果把str5[3]="you"改成str5[5]="you"这时C其实也不对,为什么?
第二个我懂了。
3.这道题是让解释为什么程序得到的结果是这样子,我推了好几遍,,,,得不到结果,是不是理解错了???
  假设有这个: char s[20]="change",*p[2]; p[0]=&s[2];p[1]=&s[4];puts(p[0]);puts(p[1]);这个得到的结果又是什么?
作者: huangqiwa    时间: 2014-6-15 23:20
剑气近 发表于 2014-6-15 22:43
1.如果把str5[3]="you"改成str5[5]="you"这时C其实也不对,为什么?
第二个我懂了。
3.这道题是让解释为 ...

invert(perv+1,endp-1);//因此最后change 第一次比较 c<e 因此 变成ehangc
//第二次比较h<g 变成eganhc 第三次比较 a<n编程egnahc 第四次发现p2指向是n 已经大于p1指向的字符a
所以函数不进行比较,递归结束!

这就是解释呀!
作者: 剑气近    时间: 2014-6-15 23:54
huangqiwa 发表于 2014-6-15 23:20
invert(perv+1,endp-1);//因此最后change 第一次比较 c

这下明白了,谢谢哥哥的帮助




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2