2017-07-09 63 views
-3

我正在學習有關C++中的指針。定義strlen的函數說明

我研究並找到了將strlen定義爲這樣的手動函數。

int strlen(const char *a){ 
    const char *b; 
    for (b=a;*b;++b); 
    return b-a; 
} 

任何人都可以用純英文解釋這段代碼嗎?特別是,爲什麼* b在for循環中被設置爲終止條件?

這不是家庭作業的答案。這只是我在研究時出現的一個問題。謝謝。

+0

作爲條件的'* b'與'* b!='\ 0''相同,也就是說'b'不指向字符串終止符或字符串中的所有字符。 – pmg

+0

'strlen'接受以空字符結尾的字符串,條件'* b'在到達字符串末尾時將變爲false。你可以將它改寫爲'if('\ 0'== * b){break;}' – VTT

+0

C和C++是不同的語言。你的代碼是C.你需要花更多的時間閱讀關於C的內容。''* b'正在引用'b'指針。當它指向的'char'是0時,它變成假。 –

回答

2

這是一個特別簡單的C代碼,帶有一個for循環,沒有主體。

的想法是指針b設置爲字符串a的開始,並保持前進,直到你打字符'\0',這表明stirng結束(即作爲空終止)。在該循環中沒有其他任何事情需要做,因此它的身體是空的。

一旦循環結束,從b中減去a就會得到字符串的初始字符與其空終止符(即字符串的長度)之間的字符數。

這裏是寫入相同的循環更可讀的方式:

for (b=a ; *b != '\0' ; ++b) // Use explicit comparison to zero 
    ;      // Put semicolon on a separate line 

當C的表達用在需要的邏輯表達式,爲零的隱式比較施加一個語句中使用。因此,*b != '\0'*b相同。

2

在C和C++字符串真的叫空終止字節串空終止符等於零。在C和C++中,零值相當於假。

循環所做的是迭代,直到「當前字符」(由b指向)變得等於終止符。

+1

此外,在真正的C++ 11中,最好使用'std :: string'作爲字符串 –

+0

@BasileStarynkevitch:「11」修飾符可能是無關緊要的 - 該點代表任何版本的語言標準。這表示在C++中存在以null結尾的字符串和'std :: strlen()';它不會因爲使用它們而成爲「真正的C++」。事實上,C++ 11例如用'std :: strlen_s()'擴展C字符串處理函數。 – Clifford

+0

@某些程序員老兄:謝謝你很難選擇哪個答案更好,但你也回答了我的問題。 –