gpt4 book ai didi

C 指针 : difference between while(*s++) { ;} and while(*s) { s++;}

转载 作者:太空狗 更新时间:2023-10-29 15:11:59 27 4
gpt4 key购买 nike

我正在经历 K & R,并且在递增指针时遇到困难。练习 5.3(第 107 页)要求您使用指针编写一个 strcat 函数。

在伪代码中,该函数执行以下操作:

  1. 将 2 个字符串作为输入。
  2. 找到字符串 1 的结尾。
  3. 将字符串二复制到字符串一的末尾。

我得到了一个有效的答案:

void strcats(char *s, char *t)
{
while (*s) /* finds end of s*/
s++;
while ((*s++ = *t++)) /* copies t to end of s*/
;
}

但我不明白为什么这段代码也不起作用:

void strcats(char *s, char *t)
{
while (*s++)
;
while ((*s++ = *t++))
;
}

很明显,我遗漏了一些关于指针递增如何工作的信息。我认为递增 s 的两种形式是等价的。但是第二段代码只打印出字符串s。

我尝试了一个虚拟变量 i 来检查函数是否经历了两个循环。它做了。我阅读了 K & R 的第 5.4 和 5.5 节,但我找不到任何可以阐明这一点的内容。

谁能帮我弄清楚为什么我的函数的第二个版本没有按照我的意愿进行?谢谢!

编辑:谢谢大家。令人难以置信的是,您可以盯着一个相对简单的错误看多久而没有注意到它。有时没有比让别人看一眼更好的补救方法了。

最佳答案

这个:

while(*s++)
;

由于后递增,将 nul 字节定位在字符串的末尾,然后在退出循环之前再次递增它。 t 在 nul 之后被复制:

scontents␀tcontents␀

打印 s 将在第一个 nul 处停止。

这个:

while(*s)
s++;

在找到 0 时从循环中断,因此您将指向 nul 字节。 t 被复制到 nul 上:

scontentstcontents␀

关于C 指针 : difference between while(*s++) { ;} and while(*s) { s++;},我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9447866/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com