4 回答

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

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

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