You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

用指针实现C语言strcat函数遇问题:两种while循环差异解析

问题分析:指针实现strcat时的循环差异问题

你的核心问题在于两个while循环对指针s的最终指向位置不同,直接导致了拼接失败。

错误循环的执行逻辑

先看你最初写的循环:

while(*s++)
    ;

这个循环的执行步骤是:

  1. 先判断当前*s的值是否为非0(即不是字符串结束符'\0')
  2. 如果条件为真,执行空循环体,然后执行s++
  3. 关键:当*s是'\0'时,条件为假,但s++仍然会执行——循环结束后,s指向的是原字符串末尾'\0'的下一个内存地址。

正确循环的执行逻辑

再看修改后的正确循环:

while(*s!='\0')
    s++;

它的执行步骤是:

  1. 判断当前*s是否不等于'\0'
  2. 如果条件为真,执行s++,然后回到判断条件
  3. 当*s等于'\0'时,循环终止,此时s正好指向原字符串末尾的'\0'位置。

为什么会导致拼接失败?

当使用错误的循环时:

  • 循环结束后s跳过了原字符串的'\0',后续的while(*s++=*t++)确实会把t的内容写到内存中,但原字符串的'\0'还留在原来的位置。
  • printf("%s")输出字符串时,会在遇到第一个'\0'时停止,所以你看不到后面拼接的"ho"。

当使用正确的循环时:

  • s指向原字符串的'\0',执行*s++=*t++时,会先把t的第一个字符'h'覆盖原有的'\0',接着依次赋值'o'和t末尾的'\0'。
  • 最终字符串变成 hi nice to meet you ho\0,printf可以正确输出完整内容。

验证小技巧

你可以在两个循环结束后分别添加一句打印指针地址的代码:

printf("s的地址:%p\n", s);

运行后会发现,错误循环后的s地址比正确循环后的地址多1个字节(因为跳过了'\0'),直观看到两者的差异。

内容的提问来源于stack exchange,提问作者Zolo_Ryan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 14:32:21