我正在使用调试器来读取这段代码,我对while ((*d++ = *s2++));
有点困惑 - 在调试器变量中,d似乎在每次循环后缩短(从'Hello hello'
到'ello hello'
,而s1
变为'cello hello'
)。什么是循环循环(不应该是while(condition); do(something))
?
为什么d和s1的变量值不相同(不是d是指向s1的指针)?当他们返回主函数时,curdst
= dst
的指针?
/*
Input: char pointers for source (s2) and destination (s1)
Output: returns the pointer to the destination (s1)
*/
char *my_strcpy(char * , const char * );
int main()
{
char src[] = "cs23!";
char dst[]="Hello hello";
char *curdst;
int len=0;
while(src[len++]);
// do the copy
curdst= my_strcpy(dst, src);
// check to see if the NULL char is copied too.
printf("dst array %s and last element %d\n", dst, atoi(&dst[len]));
return 0;
}
char *my_strcpy(char *s1, const char *s2) {
register char *d = s1;
// print the pointer variables address and their contents, and first char
printf("s2 address %p, its contents is a pointer %p to first char %c \n", (void *)&s2, (void *)s2, *s2);
printf("s1 address %p, its contents is a pointer %p to first char %c \n", (void *)&s1, (void *)s1, *s1);
while ((*d++ = *s2++));
return(s1);
}
这是strcpy()
的一个相当典型的教学实现。它的工作原理如下:
my_strcpy()
有两个论点。第一个参数是指向目标字符数组的第一个元素的指针。第二个参数是指向源字符串的第一个元素的指针,即由NUL
(aka \0
)字符终止的字符数组。该函数将字符串从源字符串复制到目标缓冲区,包括NUL
终结符,并返回指向目标缓冲区的第一个元素的指针。
char *my_strcpy(char *s1, const char *s2) {
char *d = s1;
* s2
复制到d
指向的位置,就像执行* d = * s2
一样;然后
增加d
指向目标缓冲区中的下一个位置,就像执行d++
并增加s2
指向要复制的下一个字符一样,如同执行s2++
;和
如果复制的最后一个字符是NUL
,则退出循环。
这是以非常简洁的方式编写的:
while (* d++ = * s2++);
* s2++
的意思是“采取s2
指向的角色然后增加s2
”。类似地,* d++
作为左手值意味着“使用d
指向的变量然后增加d
”。运算符的优先顺序有助于省略括号,因为++
的优先级高于*
,后者的优先级高于=
。赋值的值是赋值,因此当赋值的字符值为0时,循环结束。s1
,该功能没有改变。
return s1;
}