为什么这么写不可以?

来源:6-8 字符串函数

Pheromone

2015-07-12 13:59

#include <stdio.h>

#include <string.h>

int main()

{

    char s1[100]="";

    char s2[]="我爱,";

    char s3[]="慕课网";

    strcat(s2,s3);

    strcpy(s1,s2);

    

    

    printf("%s\n",s1);

    return 0;    

}


写回答 关注

2回答

  • onemoo
    2015-07-12 21:57:54
    已采纳

    吐槽一下:本站应该把同类问题进行下归类,显示在相应课程中,因为用户在发问前都不会先去搜索之前的答案...

    正文:

    首先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的空间足够多。


    最后提示下:本站帖子里有格式化代码的功能,你可以不用手打代码格式。

    onemoo 回复飞少lege...

    在编译时C语言并不会对溢出进行检测,所以这代码可以正常通过编译。 这个代码在运行时肯定会发生溢出的,但如果溢出的部分并没有覆盖到其他重要的数据的话,是可能不会引起崩溃的。 但这是非常危险的代码,有严重的安全隐患,现实中绝对不要这样写!

    2015-09-29 14:24:10

    共 8 条回复 >

  • PENG121
    2015-08-02 11:25:25

    我也是这么干的

C语言入门

C语言入门视频教程,带你进入编程世界的必修课-C语言

926025 学习 · 20793 问题

查看课程

相似问题