為什么這么寫不可以?
#include <stdio.h>
#include <string.h>
int main()
{
? ? char s1[100]="";
? ? char s2[]="我愛,";
? ? char s3[]="慕課網(wǎng)";
? ? strcat(s2,s3);
? ? strcpy(s1,s2);
? ??
? ??
? ? printf("%s\n",s1);
? ? return 0; ? ?
}
#include <stdio.h>
#include <string.h>
int main()
{
? ? char s1[100]="";
? ? char s2[]="我愛,";
? ? char s3[]="慕課網(wǎng)";
? ? strcat(s2,s3);
? ? strcpy(s1,s2);
? ??
? ??
? ? printf("%s\n",s1);
? ? return 0; ? ?
}
2015-07-12
舉報(bào)
2015-07-12
吐槽一下:本站應(yīng)該把同類問題進(jìn)行下歸類,顯示在相應(yīng)課程中,因?yàn)橛脩粼诎l(fā)問前都不會(huì)先去搜索之前的答案...
正文:
首先,s1、s2 和 s3 都是什么:
s1是一個(gè)長度為100的字符數(shù)組。
s2是一個(gè)長度為4的字符數(shù)組。這是因?yàn)殡m然你在聲明時(shí)沒有指定數(shù)組的長度,但是你用一個(gè)長度為4的字符串初始化s2,所以編譯器自動(dòng)將s2的長度確定為4。
s3是一個(gè)長度為4的字符數(shù)組。道理同上。
再說strcat函數(shù)會(huì)干什么:
strcat(s2, s3) 這個(gè)函數(shù)是將s3中的內(nèi)容(包括s3結(jié)尾的'\0')復(fù)制到s2中最后一個(gè)字符的后面(覆蓋掉s2原來結(jié)尾的'\0'),這樣就能把兩個(gè)字符串中的字符連起來了,并且還是'\0'結(jié)尾。
注意:這就需要s2有足夠的長度來容納這么多的字符,長度至少為?strlen(s2) + strlen(s3) + 1,最后這個(gè)1就是結(jié)尾的'\0'。
但是你的s2長度只有4,所以寫越界了。在調(diào)用用strcat、strcpy之類的函數(shù)時(shí)一定要注意是否有足夠的存儲(chǔ)空間來容納你要操作的字符。如果你越界了,你的代碼是可以編譯通過的,但在運(yùn)行的時(shí)候很可能就會(huì)發(fā)生錯(cuò)誤,這就是所謂的“緩沖區(qū)溢出”錯(cuò)誤,可能會(huì)引起嚴(yán)重的問題。
在本站的這個(gè)題目中,它看到你寫了 strcat(s1, ...) 這樣的代碼才算對(duì),因?yàn)閟1的空間足夠多。
最后提示下:本站帖子里有格式化代碼的功能,你可以不用手打代碼格式。
2015-08-02
我也是這么干的