第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請及時(shí)綁定郵箱和手機(jī)立即綁定

為什么這么寫不可以?

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

}


正在回答

2 回答

吐槽一下:本站應(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的空間足夠多。


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

3 回復(fù) 有任何疑惑可以回復(fù)我~
#1

Pheromone 提問者

謝謝你的回答,同時(shí)謝謝你的友情提示。
2015-07-13 回復(fù) 有任何疑惑可以回復(fù)我~
#2

章然

請問一個(gè)中文字占多少字符的?
2015-07-14 回復(fù) 有任何疑惑可以回復(fù)我~
#3

章然

還有,strcat(s1,s2)可行嗎?
2015-07-14 回復(fù) 有任何疑惑可以回復(fù)我~
#4

onemoo 回復(fù) 章然

這個(gè)問題就復(fù)雜了... 有很多的語言需要編碼,各國針對(duì)自己的語言文字創(chuàng)造了很多的字符集。過去網(wǎng)頁上常遇到的“亂碼”就是因?yàn)樽址黄ヅ洹?但是有這么多的字符集還是不方便使用,所以就創(chuàng)造了Unicode。目標(biāo)就是把所有語言的所有字符以及符號(hào)都統(tǒng)一編碼。 光有規(guī)劃好的字符集方案也是不夠的,計(jì)算機(jī)得用一種方法把字符的編碼記錄下來,這就是字符集編碼。Unicode編碼有UTF-32 UTF-16 UTF-8,目前最常用也是最推薦使用的就是UTF-8編碼。 UTF-8是一種變長編碼,一般一個(gè)中文字占用3-4個(gè)字節(jié)
2015-07-14 回復(fù) 有任何疑惑可以回復(fù)我~
#5

onemoo 回復(fù) 章然

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

飛少legender

#include <stdio.h> #include <string.h> int main() { char s1[100]=""; char s2[]="我愛,"; char s3[]="慕課網(wǎng)"; /*在以下補(bǔ)全代碼*/ strcat(s2,s3); printf("%s\n",s2); //strcpy(s1,s2); //strcat(s1,s3); //printf("%s\n",s1); return 0; }為何這樣寫能運(yùn)行出結(jié)果,而并沒有顯示越界。請指教!
2015-09-28 回復(fù) 有任何疑惑可以回復(fù)我~
#7

飛少legender

#include <stdio.h> #include <string.h> int main() { char s1[100]=""; char s2[]="我愛,"; char s3[]="慕課網(wǎng)"; /*在以下補(bǔ)全代碼*/ strcat(s2,s3); printf("%s\n",s2); return 0; }為什么這樣寫可以運(yùn)行出結(jié)果,而并沒有顯示溢出。求指教!
2015-09-28 回復(fù) 有任何疑惑可以回復(fù)我~
#8

onemoo 回復(fù) 飛少legender

在編譯時(shí)C語言并不會(huì)對(duì)溢出進(jìn)行檢測,所以這代碼可以正常通過編譯。 這個(gè)代碼在運(yùn)行時(shí)肯定會(huì)發(fā)生溢出的,但如果溢出的部分并沒有覆蓋到其他重要的數(shù)據(jù)的話,是可能不會(huì)引起崩潰的。 但這是非常危險(xiǎn)的代碼,有嚴(yán)重的安全隱患,現(xiàn)實(shí)中絕對(duì)不要這樣寫!
2015-09-29 回復(fù) 有任何疑惑可以回復(fù)我~
查看5條回復(fù)

我也是這么干的

0 回復(fù) 有任何疑惑可以回復(fù)我~

舉報(bào)

0/150
提交
取消
C語言入門
  • 參與學(xué)習(xí)       926907    人
  • 解答問題       21533    個(gè)

C語言入門視頻教程,帶你進(jìn)入編程世界的必修課-C語言

進(jìn)入課程

為什么這么寫不可以?

我要回答 關(guān)注問題
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)