问题 填空题

下列程序中的函数stropy2()实现字符串两次复制,即将t所指字符串复制两次到s所指内存空间中,合并形成一个新字符串。例如,若t所指字符串为:efgh,调用strcpy2后,s所指字符串为:efghefgh。请填空。 #include <stdio.h> #include <string.h> void strcpy2(char *s,char *t) { char *p=t; while(*s++=*t++); s= 【15】 ; while( 【16】 =*p++); } main() { char str1[100]="abed",str2[]="efgh"; strcpy2(str1,str2); printf("%s\n",str1); }

答案

参考答案:[15]s-1或--s或s--

解析:[16]*s++在函数。strcpy2()中,首先将指针t保存到指针p中,然后进入第1个while()循环,其循环条件为*s++=*t++,其中“*”和“++”运算符的优先级相同,但他们的结合性为从右至左,而“=”运算符优先级比较低,所以原表达式等价于(*s++)=(*(t++)),即将t当前所指内容复制到s当前所指地址中,然后让s和t同时往后移动一位,整个表达式返回的是复制给s的值。所以,当t所指内容是字符串结束符’\0’,时,while循环结束,原先t所指的整个字符串也就复制到s所指的地址中去了。但是,while循环最后一次判断也会让s和t往后移动一位,即此时s指向了字符串结束符’\0’的后一位。所以第2次复制字符串之前,应先将s指针往回移动一位,故前一空应该填入s-1或其他等价形式。接下来的while循环实现第二次复制,照抄第1次的while循环就行,故后一空应填入*s++。

填空题
单项选择题