我使用调试器来阅读此代码,并且我对while ((*d++ = *s2++));
感到困惑 - 在调试器变量中,d似乎在每个循环之后缩短(从{{1开始)当'Hello hello'
更改为'ello hello'
时,{}为s1
。循环的while循环是什么(不应该是'cello hello'
?
为什么d和s1的变量值不相同(isn' t d是指向s1的指针)?当他们返回主函数时,while(condition); do(something))
=指针curdst
?
dst
答案 0 :(得分:2)
这是strcpy()
的一个相当典型的教学实现。它的工作原理如下:
my_strcpy()
有两个参数。第一个参数是指向目标字符数组的第一个元素的指针。第二个参数是指向源字符串的第一个元素的指针,即由NUL
(又名\0
)字符终止的字符数组。该函数将字符串从源字符串复制到目标缓冲区,包括NUL
终结符,并返回指向目标缓冲区的第一个元素的指针。
char *my_strcpy(char *s1, const char *s2) {
首先,复制第一个参数,因为我们需要在复制完成后返回它。
char *d = s1;
然后,复制字符;这是在一个紧凑的循环中完成的,工作方式如下:
* s2
复制到d
指向的位置,就像执行* d = * s2
一样;然后d
增加为指向目标缓冲区中的下一个位置,就像执行d++
并将s2
增加为指向要复制的下一个字符一样,就像执行{{1}一样};和s2++
。这是以非常简洁的方式写的:
NUL
while (* d++ = * s2++);
表示“接受* s2++
指向的字符,然后递增s2
”。类似地,s2
作为左手值意味着“使用* d++
指向的变量然后递增d
”。运算符的优先顺序有助于省略括号,因为d
的优先级高于++
,其优先级高于*
。赋值的值是赋值,因此当赋值的值为0时,循环结束。
最后,返回=
,该函数未更改。
s1