1 回答

TA貢獻(xiàn)883條經(jīng)驗(yàn) 獲得超454個(gè)贊
這題目又錯(cuò)了!
準(zhǔn)確的答案是:這代碼的結(jié)果是未定義的。? 實(shí)際上,這段代碼在運(yùn)行時(shí)極有可能會(huì)崩潰。
原因就出在 strcpy(s1, s2) 這里,這個(gè)函數(shù)會(huì)把 s2 所指的字符串(包括結(jié)尾的null字符)復(fù)制到 s1 所指的字符串中。
但這題目的 s1 所指的是字符串字面量,字符串字面量是不可修改的!按 C 標(biāo)準(zhǔn)的說(shuō)法,就是“修改它的行為是未定義的”。實(shí)踐中,試圖修改字符串字面量有極大的可能引起程序崩潰,所以這段代碼不會(huì)有任何結(jié)果。
我都不想再吐槽了...
其實(shí)呢,我明白這題目要考察的知識(shí)點(diǎn)是什么。? 干脆我把題目修改成正確的吧,然后再講下結(jié)果是啥。
既然題目錯(cuò)在 s1 指向不可修改的字符串了,那就修改成這樣: char s1[] = "12345"? ? 這樣 s1 就是字符數(shù)組了,這次再修改 s1 的內(nèi)容就沒(méi)問(wèn)題了。
那么題目要考的是什么呢?? ?就是 strcpy 這個(gè)函數(shù)會(huì)把 s2 所指的字符串全部復(fù)制過(guò)來(lái)——包括結(jié)尾的null字符——題目想考的點(diǎn)。? ?還有就是 strcpy 會(huì)返回 s1。
s1 中本來(lái)有 6 個(gè)字符: 1 2 3 4 5 '\0'
strcpy 之后,s1 的內(nèi)容成了:1 2 3 4 '\0' '\0'? ? ?也就是原本的 5 被從 s2 中過(guò)來(lái)的 null 字符替換了。
strlen 是用來(lái)計(jì)算字符串中字符個(gè)數(shù)的函數(shù)。參數(shù)是字符指針,當(dāng)然它必須指向某字符串中。函數(shù)計(jì)算字符個(gè)數(shù)的方法就是:從參數(shù)所指的字符串的位置開(kāi)始向后數(shù),直到遇到 null 字符,并且 null 字符不計(jì)算在內(nèi)——題目想考的也有這個(gè)。
這樣 strlen(s1) 最終結(jié)果是 4。
- 1 回答
- 1 關(guān)注
- 1469 瀏覽
添加回答
舉報(bào)