问答详情
源自:6-8 字符串函数

为什么strcat(s1,strcat(s2,s3));不行呢?

但是strcat(strcat(s1,s2),s3);就行了呢

提问者:柚子子 2015-07-03 19:31

个回答

  • onemoo
    2015-07-03 23:48:15

    先说明:

    strcat(s1, strcat(s2, s3));  // 相当于:
    strcat(s2, s3);  // 先把s3接到s2后面
    strcat(s1, s2);  // 再把s2接到s1后面
    strcat(strcat(s1, s2), s3);  // 相当于:
    strcat(s1, s2);  // 先把s2接到s1后面
    strcat(s1, s3);  // 再把s3接到s1后面

    再看看s1、s2 和 s3 都是什么:

    s1是一个长度为100的字符数组。

    s2是一个长度为4的字符数组。这是因为虽然你在声明时没有指定数组的长度,但是你用一个长度为4的字符串初始化s2,所以编译器自动将s2的长度确定为4。

    s3是一个长度为4的字符数组。道理同上。

    再说strcat函数会干什么:

    strcat(s2, s3) 这个函数是将s3中的内容(包括s3结尾的'\0')复制到s2中最后一个字符的后面(覆盖掉s2原来结尾的'\0'),这样就能把两个字符串中的字符连起来了,并且还是'\0'结尾。

    注意:这就需要s2有足够的长度来容纳这么多的字符,长度至少为 strlen(s2) + strlen(s3) + 1,最后这个1就是结尾的'\0'。

    但是你的s2长度只有4,所以写越界了。在调用用strcat、strcpy之类的函数时一定要注意是否有足够的存储空间来容纳你要操作的字符。如果你越界了,你的代码是可以编译通过的,但在运行的时候很可能就会发生错误,这就是所谓的“缓冲区溢出”错误,可能会引起严重的问题。


    在本站的这个题目中,它看到你写了 strcat(s1, ...) 这样的代码才算对,因为s1的空间足够多。