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