为了账号安全,请及时绑定邮箱和手机立即绑定

为什么这么写不可以?

#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;    

}


正在回答

3 回答

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

正文:

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


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

3 回复 有任何疑惑可以回复我~
#1

Pheromone 提问者

谢谢你的回答,同时谢谢你的友情提示。
2015-07-13 回复 有任何疑惑可以回复我~
#2

章然

请问一个中文字占多少字符的?
2015-07-14 回复 有任何疑惑可以回复我~
#3

章然

还有,strcat(s1,s2)可行吗?
2015-07-14 回复 有任何疑惑可以回复我~
#4

onemoo 回复 章然

这个问题就复杂了... 有很多的语言需要编码,各国针对自己的语言文字创造了很多的字符集。过去网页上常遇到的“乱码”就是因为字符集不匹配。 但是有这么多的字符集还是不方便使用,所以就创造了Unicode。目标就是把所有语言的所有字符以及符号都统一编码。 光有规划好的字符集方案也是不够的,计算机得用一种方法把字符的编码记录下来,这就是字符集编码。Unicode编码有UTF-32 UTF-16 UTF-8,目前最常用也是最推荐使用的就是UTF-8编码。 UTF-8是一种变长编码,一般一个中文字占用3-4个字节
2015-07-14 回复 有任何疑惑可以回复我~
#5

onemoo 回复 章然

strcat(s1, s2) 是可行的,s1足够容乃s2中的字符。
2015-07-14 回复 有任何疑惑可以回复我~
#6

飞少legender

#include <stdio.h> #include <string.h> int main() { char s1[100]=""; char s2[]="我爱,"; char s3[]="慕课网"; /*在以下补全代码*/ strcat(s2,s3); printf("%s\n",s2); //strcpy(s1,s2); //strcat(s1,s3); //printf("%s\n",s1); return 0; }为何这样写能运行出结果,而并没有显示越界。请指教!
2015-09-28 回复 有任何疑惑可以回复我~
#7

飞少legender

#include <stdio.h> #include <string.h> int main() { char s1[100]=""; char s2[]="我爱,"; char s3[]="慕课网"; /*在以下补全代码*/ strcat(s2,s3); printf("%s\n",s2); return 0; }为什么这样写可以运行出结果,而并没有显示溢出。求指教!
2015-09-28 回复 有任何疑惑可以回复我~
#8

onemoo 回复 飞少legender

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

我也是这么干的

0 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消
C语言入门
  • 参与学习       926026    人
  • 解答问题       20793    个

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

进入课程

为什么这么写不可以?

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信