#include"stdio.h"#include"string.h" void main() { char c[]={'a','b','c'};printf("%d\n",strlen(c));}怎么輸出是7啊,加將c[]換成c[7]或者加上'\0'又對了,strlen函數(shù)是遇到'\0'終止,但是c[7]={'a','b','c'};同樣沒有'/0',但是求長是正確的,我記得系統(tǒng)會默認(rèn)加上'\0'的,例如c[7]={'a','b','c'};系統(tǒng)實際上存的是'a','b','c','\0','\0','\0','\0'。高手幫忙看下為什么strlen求錯了,這種問題該怎么避免?最佳答案:問題出在:char p[]={'a','b','c'},p[]你沒指定長度,系統(tǒng)就不知道,默認(rèn)也為無限長(可以驗證:你輸入p[16]都還可以看到有輸出,因為你沒指定p[16],所以這個輸出是系統(tǒng)隨機(jī)給的),這時你調(diào)用strlen函數(shù)來求“長度未知”的字符串,strlen“很聰明”,它就會給你輸出一個奇怪的7(但不一定只是7,你換個其他長度的字符串它又可能輸出其他數(shù)了)而且:char p[]這種形式下系統(tǒng)是不會在結(jié)尾默認(rèn)加上'\0'的!。只有在指定長度char p[5]={'a','b','c'}或者字符串形式char p[]="abc"的情況下系統(tǒng)才會在末尾默認(rèn)加上'\0',這時就不會出錯。
3 回答

烙印99
TA貢獻(xiàn)1829條經(jīng)驗 獲得超13個贊
如果您的空白內(nèi)存單元比較多的話,那么在數(shù)組最后一個元素'c’之后可能是'\0',那么正好結(jié)束strlen函數(shù),而輸出3,我剛把您的代碼復(fù)制過去,運行了下是3,以前我也不明白為什么,有的時候正確,有的時候錯誤,原因就是沒有在數(shù)組即字符串末尾加'\0',所以賦值最好用字符串,即方便,系統(tǒng)又會自動加結(jié)束符,希望能夠幫到您。

largeQ
TA貢獻(xiàn)2039條經(jīng)驗 獲得超8個贊
輸出結(jié)果是不確定的,因為你的char數(shù)組不存在末尾的'\0'
正確的初始化方式應(yīng)該是:char c[] = "abc";
補充:
只有字符串形式的初始化,編譯器才會幫你在某位補零
你用的那種方式,得到數(shù)組長度就是3,哪里來有位置補零呢?

慕的地8271018
TA貢獻(xiàn)1796條經(jīng)驗 獲得超4個贊
char c[]={'a','b','c'} ; 等價于 cha c[2]="ab";c[2]='c';
而不是 char c[] = "abc"; 這就是區(qū)別, 不知你能不能看得懂
- 3 回答
- 0 關(guān)注
- 140 瀏覽