2016-01-09 72 views
0

我正在研究C中的strlen()函數,我看到一個函數,這個函數返回diffirent的值。如果數組的容量已滿,則返回不正確的結果。如果數組容量不足,則返回true結果。 我在問是什麼原因?
非常感謝所有讀者。
即功能爲什麼函數根據容量返回不同的值

int myStrlen(char *s) 
{ 
    char *start; 
    start = s; 
    while (*s != 0) 
    { 
     ++s; 
    } 
    return s - start; 
} 

和主

int main() 
{ 
    char x[4] = "What"; 
    printf("%d\n", myStrlen(x)); 
    return 0; 

}//Output: 21 

另一主

int main() 
{ 
    char x[5] = "What"; 
    printf("%d\n", myStrlen(x)); 
    return 0; 

}//Output: 4 
+1

C不支持_methods_,只有_functions_。 – Olaf

+2

並使用調試器來查看會發生什麼。提示:你的第一個'main'調用未定義的行爲。 – Olaf

+3

如果你的char緩衝區只有4個字符的空間,那麼空字符在哪裏?你已經填滿了它。 –

回答

5

有了這個功能

int main() 
{ 
    char x[4] = "What"; 
    printf("%d\n", myStrlen(x)); 
    return 0; 

}//Output: 21 

有沒有空終結者x。所以它是undefined作爲myStrlen()循環它尋找空終止符和任何結果是可能的。

作業本身是有效的,並且字符串文字"What"的前四個字節被複制到x中。但數組x不能用作C字符串。

+0

非常感謝。你的鏈接和解釋對我很有幫助。@ l3x – ZpCikTi

+0

很高興幫助。一般來說,如果你正在*拷貝*(就像在你的代碼中)一個字符串字面值,那麼最好不*明確指定大小,比如'char str [] =「Hello」;'。在這裏,編譯器會爲'str'分配必要的大小,如果您決定更改字符串文字,則不需要擔心。如果你有'char s [5] =「what」;'那麼它的大小是正確的。但後來,如果將字符串文字更改爲'「What?」',那麼您還必須更改長度(這通常會被忽略並導致問題)。通過不指定尺寸,更容易避免這種錯誤。 –

6

字符串"What"char[5]類型的由於結尾的空字節。使用char[4]的定義會截斷字符串並刪除空字節。

由於在這種情況下空終止符丟失,myStrlen調用未定義的行爲。

只需使用

char str[] = "What"; 

沒有真正的代碼,任何顯式數組長度。


而且,隨着@Olaf在你的問題中留言說:C沒有方法,但功能
方法在C++中是可用的,它們是虛函數的別名,在Java中(我對此沒有線索)。

Stroustroup先生說上++在他的著作「C++編程語言4 版,」第20.3.2用C方法如下:

虛成員函數有時也被稱爲一個方法。

+0

將所有成員函數稱爲面嚮對象語言的方法是很常見的,C++是一個例外。然後用虛擬方法和靜態方法重申這一點。我不認爲指出這些差異是非常明智的,因爲沒有跨語言的標準術語,只有某些社區對相同的概念使用不同的名稱。如果您習慣於一種語言社區的命名並進入另一種語言社區,那麼這會變得非常混亂...... –

+0

@ZdeněkJelínek每種語言都有不同的術語。 C中的字符串在其他OO語言中完全不同(希望可以作爲類比)。與Java函數相反,C++函數是不同的。在C++中使用術語「方法」是誤導性的,因爲它是一個**虛擬**成員函數,並且我們可以稱之爲約定(不是標準的,而是慣例)。我對初學者的建議是:學習術語,遵守約定,並牢記C++與Java本質上和大量的不同。 – Downvoter

+0

我喜歡你做的比較。我實際上認爲,無論何時你說「string」,每個人都有一個關於你在說什麼的想法,無論是程序集,C,C++,Java,...程序員,還是DBA。即使只涉及面向對象的社區,我也懷疑你可以對「成員函數」說同樣的話。然而,我同意這樣一個事實,即一個人應該使用適當的術語作爲調用'功能','方法'是完全關閉的。 –

2

在C(和C++)中,字符串以二進制0或'\ 0'結尾。你的聲明太短了,所以你產生了一個未終止的字符串,這將導致各種錯誤和崩潰,這取決於你對它做了什麼。

第一個影響是strlen函數繼續通過該字符串後面的內存進行計數,直到碰巧找到0;那可能是在21,在134,或以崩潰結束 - 你是不屬於該程序的內存,遲早會產生問題。

您需要將該字符串聲明爲[5],以便爲終止'\ 0'留出空間。

+1

請勿混淆聲明和定義。數組聲明根本不需要大小說明符。 – Downvoter

相關問題