4 回答

TA貢獻883條經(jīng)驗 獲得超454個贊
s1后面是有0:
你說得沒錯,s1就是char數(shù)組,定義時未初始化的部分為0,并且字符串后面會加上一個'\0'代表字符串結(jié)尾。所以s1的開頭的5個元素是'H' 'e' 'l' 'l' 'o',后面一個'\0',剩下的都是0。
s2也是同樣的道理,當然s2的大小正好容納下W o r l d這5個字符和一個'\0',所以后面沒有多余的0了。
你想問的是不是:為什么strcat函數(shù)就知道要把s2中的字符串接在s1中最后一個字符'o'后面?
C語言規(guī)定字符串的形式就是:內(nèi)存中的連續(xù)存放的一串char,并且用'\0'代表字符串的結(jié)束。
所以strcat函數(shù)——包括庫中所有處理字符串的函數(shù)——都是這樣判斷的:strcat從s1中讀到第一個'\0',它就知道這串字符串到這里就結(jié)束了,然后會把s2中的字符依次拷貝到s1中的這個'\0'及后面的內(nèi)存中,直到拷貝到s2中的'\0',函數(shù)就知道s2所表示的字符串也結(jié)束了,最后它會保證這個新連接成的字符串也是以'\0'做結(jié)尾的(必須以'\0'標志字符串結(jié)束)。
這樣看,你也可以說是s1中后面的0被舍去了。 那些0雖然在s1數(shù)組中,但它們根本就不算是字符串的一部分。庫中的字符串處理函數(shù)永遠是用'\0'來判斷字符串是否到結(jié)尾的。
而且從strcat函數(shù)工作流程的描述中你也能看出來:函數(shù)只是在不斷將字符拷貝過來,直到'\0'才結(jié)束拷貝,函數(shù)根本不管到底要拷貝多少個! 這才是為什么要求s1有足夠大的大小來容納連接后的字符串,并且這一點需要由程序員來保證!

TA貢獻20條經(jīng)驗 獲得超5個贊
不好意思,這幾天加班,這會兒才得空,回答下你的問題:
第一個問題:
我盡量不敷衍地告訴你記住就可以了,而會嘗試從原理講明白為什么初始化成'\0'而不是'0'
首先你得先了解一個叫ASSCII(美國信息交換標準代碼)的東西,詳細定義可以看下wiki或者百度百科:
引用百度百科圖片:
在C語言中char類型占1byte,即8bit,能夠表示的范圍是00000000~11111111(二進制),即0~255(十進制),實際存儲的就是ASCII碼
比如'0'在上圖表示48(十進制)即00110000(二進制)
再比如'\0'在上圖表示0(十進制)即00000000(二進制)
發(fā)現(xiàn)了嗎?char類型的0實際上是00000000即我們平常所說的'\0',顯然即便是你設(shè)計也不會設(shè)計成默認補00110000('0')吧?
這下你理解了吧?至于為什么初始化為'\0',這個大概是編譯器編譯、鏈接、生成可執(zhí)行代碼后,由計算機執(zhí)行時會自動為沒有賦值的字符補'\0'吧,至于更加深入的比如機器執(zhí)行二進制代碼和編譯器gcc的編譯過程就沒有研究過了。
第二個問題:
是的,不好意思筆誤指向\0
第三個問題:
*在C語言中是指針,是C/C++語言的特色也是難點,簡單說就是個8bit數(shù)字(64位機器),表示內(nèi)存地址,
char?s1[20]="Hello"; char?*dest?=?s1; char?*tmp?=?dest; //?上一行代碼含義 //?s1: //?Hello\0\0\0\0\0...\0 //?^ //?| //?*tmp,*dest
上面這段注釋表示char類型的指針tmp和char類型的指針dest都指向字符數(shù)組s1的首地址,有關(guān)指針的詳細的教程你只要繼續(xù)深入地往下學,就都會明白了,要想完全理解函數(shù)strcat的源碼,需要你理解指針,我只是簡單告訴你含義

TA貢獻883條經(jīng)驗 獲得超454個贊
寫不開,我再開一貼:
我的回答中其實已經(jīng)講解了為什么那些0不會保留下來。并且我并沒有直接告訴你“0被舍去”。
我先告訴了你C語言中字符串的形式——就是以'\0'結(jié)尾的一串char。?
然后我向你描述了strcat的工作原理——strcat的作用是拼接字符串,所以它就把s1作為字符串來看待。字符串就是內(nèi)存中的連續(xù)存放的一串char,并且用'\0'代表字符串的結(jié)束。
strcat看到s1中開頭依次是H e l l o后,發(fā)現(xiàn)后面是一個'\0',于是它就知道這字符串結(jié)束了,隨后它會將s2處的字符拼接到剛剛的那個'\0'那里(會覆蓋掉這個'\0')... ?我前面和你說“你也可以把這行為看作是0被舍去”,但實際上strcat根本就不會在數(shù)組20個元素之后再拼接,相反它是從s1所代表的字符串結(jié)束處——也就是Hello后面的第一個'\0'處——開始拼接s2所代表字符串。 ?
另外,雖然你沒問,不管s2有多大——就算s2是有100個char的數(shù)組(s2中剩下的部分也都是0)——strcat也并不會將s2數(shù)組的全部內(nèi)容都拼接過來。 原因是同樣的:strcat把s2也看作是字符串,它發(fā)現(xiàn)World后面的'\0'時就知道s2所代表的字符串結(jié)束了,不會再繼續(xù)拷貝后面的內(nèi)容了。
總之,strcat并沒有把s1當作含有20個char的數(shù)組來看待(事實上strcat根本就不知道s1是個數(shù)組),strcat完全是把它當作依據(jù)字符串來看待的。
最后你問的s1的大小是否至少要有10+1個? ??
沒錯是這樣的,s1至少要能存儲HelloWorld這10個字符和最后的1個'\0'。
- 4 回答
- 0 關(guān)注
- 3218 瀏覽
添加回答
舉報