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

470045812ece43499b5d4deae8f78d1a.png

wwpbjing

很高兴你能刨根问底,篇幅比较长,请耐心看完,先介绍下实验环境:C编译器:gcc6.1.0C调试器:gdb7.11.1为了讲明白,先来做个实验,见下图看到了吗?即便s1='Hello\0World',puts(s1)却只会显示Hello让我们用gdb debug一下,看看s1存成什么样看到了吗?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',但它们是真实存在的再来看你提的问题:仔细看下图:上图告诉我们未执行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、付费专栏及课程。

余额充值