c语言实现strcat函数要加 0 么,合并函数strcat()运用时字符串数组中为0的元素难道被舍去?...

"本文通过实验演示了C语言中puts函数处理字符串的特性,即遇到''字符时停止显示。接着,详细分析了strcat函数的源码,解释了它如何在字符串末尾拼接另一个字符串。实验结果显示,strcat函数在Hello后添加World,且在''后的内容不会被puts显示。通过对strcat的源码解读,揭示了字符串内存管理的细节,解答了关于''之后字符消失的疑问。"
摘要由CSDN通过智能技术生成

很高兴你能刨根问底,篇幅比较长,请耐心看完,先介绍下实验环境:

C编译器:

gcc6.1.0

C调试器:

gdb7.11.1

c763679abbadf837eadc607f0656f70f.png

为了讲明白,先来做个实验,见下图

b691ee8462132c889e1231be50771e95.png

看到了吗?即便s1='Hello\0World',puts(s1)却只会显示Hello

让我们用gdb debug一下,看看s1存成什么样

c3dac4c2b4b3fdbda940265648a96121.png

a49b1f33e8cb46c974225797e766cd59.png

看到了吗?s1确实是{'H','e','l','l','o','\0','W','o','r','l','d',9个'\0'}

但puts(s1)却只显示Hello,原因是puts自动忽略了\0后面的'W','o','r','l','d',9个'\0',但它们是真实存在的

再来看你提的问题:

48c9f0f586439db439ea2bcd22ac34b7.png

dc0b876858f7321666a13614e38d8281.png

仔细看下图:

a5f6b68b0f27915fcbaaf29e5b245760.png

上图告诉我们未执行strcat时s1{'H','e','l','l','o',15个'\0'}

执行strcat(s1,s2)后s1{'H','e','l','l','o','W','o','r','l','d',10个'\0'}

由实验一我们知道puts函数会把\0后截掉,最终只会显示HelloWorld

那么Hello后面那15个'\0'去哪了?为什么不是Hello 15个\0 World呢?让我们读读strcat的源码:

strcat源码节选:164 #ifndef __HAVE_ARCH_STRCAT

165 /**

166  * strcat - Append one %NUL-terminated string to another

167  * @dest: The string to be appended to

168  * @src: The string to append to it

169  */

170 #undef strcat

171 char *strcat(char *dest, const char *src)

172 {

173         char *tmp = dest;

174

// 上一行代码含义

// Hello\0\0\0\0\0...\0

// ^

// |

// *tmp,*dest

175         while (*dest)

176                 dest++;

// 上两行代码含义

// Hello\0\0\0\0\0...\0

// ^    ^

// |    |

// *tmp |

//      *dest

177         while ((*dest++ = *src++) != '\0')

178                 ;

// 上一行代码含义

// HelloW\0\0...\0

// ^     ^

// |     |

// *tmp  |

//       *dest

// HelloWo\0\0...\0

// ^     ^

// |     |

// *tmp  |

//       *dest

...

// 上一行代码含义

// HelloWold\0\0...\0

// ^        ^

// |        |

// *tmp     |

//          *dest

179         return tmp;

180 }

181 EXPORT_SYMBOL(strcat);

182 #endif

仔细读上面源码我添加的注释,可以看出函数strcat

会从s1的第一个'\0'处拼接s2即:World,至此所有问题都解答了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值