亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

?252、若有以下定義和語句: char

?252、若有以下定義和語句: char

C
包小龍蝦 2018-09-10 20:13:35
252、若有以下定義和語句: char *s1="12345",*s2="1234"; printf("%d\n",strlen(strcpy(s1,s2))); 則輸出結果是?A) 4 B)5 C)9 D)10
查看完整描述

1 回答

已采納
?
onemoo

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。

查看完整回答
反對 回復 2018-09-11
  • 1 回答
  • 1 關注
  • 1510 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號