2013-04-17 63 views
3

我試圖計算數組中元素的個數,並且被告知,該行如何計算char數組中的元素數量?

int r = sizeof(array)/sizeof(array[0]) 

會給我數組中元素的個數。我發現這個方法可以工作,至少對於int數組來說。但是,當我嘗試這些代碼時,事情就會崩潰。

#include <iostream> 
#include <Windows.h> 
using namespace std; 

int main() { 
    char binaryPath[MAX_PATH]; 
    GetModuleFileName(NULL, binaryPath, MAX_PATH); 
    cout << "binaryPath: " << binaryPath << endl; 
    cout << "sizeof(binaryPath): " << sizeof(binaryPath) << endl; 
    cout << "sizeof(binaryPath[0]: " << sizeof(binaryPath[0]) << endl; 

    return 0; 
} 

,當該程序運行binaryPath的價值是

C:\Users\Anish\workspace\CppSync\Debug\CppSync.exe 

似乎有通過的sizeof返回的大小(以字節爲單位?位?IDK的,可能有人得解釋一下嗎?)的260線

sizeof(binaryPath[0]); 

給出1.

顯然然後除以一個260的值給出了260的結果,WH ich不是數組中元素的數量(按我的計算,它是42左右)。有人能解釋我做錯了什麼嗎?

我有一個偷偷摸摸的懷疑,實際上並不是一個數組(我來自Java和python),但我不確定所以我在問你們。

謝謝!

+0

像我作爲一個答案說: http://stackoverflow.com/questions/16049936/cant-output-int -s-result-of-sizeof 但我被告知這不是正確的答案,因爲它與你的代碼崩潰無關。也許你想回到這個問題並解釋(以防其他人遇到類似的問題)修復是什麼...... –

+0

在完全不同的說明中,你寫了'using namespace std;'在那裏,還是它是通過某種工具加入的嗎?只是尋找信息,不涉及任何判斷。 –

+0

'char'數組的元素數量是'MAX_PATH'。它是如此簡單。 – juanchopanza

回答

5

如果你正在尋找的字符串的大小,那麼你需要使用strlen,如果使用sizeof它會告訴你分配的量不是空的大小結束的字符串:

std::cout << "strlen(binaryPath: " << strlen(binaryPath) << std::endl; 

你會需要在頂部添加#include <cstring>

7

260是MAX_PATH,這是因爲sizeof返回整個數組的大小 - 而不僅僅是數組內的字符串的大小。

要得到你正在尋找的行爲,使用strlen代替:

cout << "binaryPath: " << binaryPath << endl; 
cout << "strlen(binaryPath): " << strlen(binaryPath) << endl; 
3

你用它包含字符串的長度混淆數組的大小。 sizeof(arrayVar)爲您提供數組的整個大小,而不管它包含的字符串有多長。您需要使用strlen()來確定它包含的字符串的實際長度。

3

回想一下,C++和C中的char數組用於存儲原始字符串,並且此類字符串的結尾由空字符標記。

操作sizeof不是動態:它會給你整個數組的大小,或任何類型你提供字節(或字符,因爲它們具有相同的大小),在你的代碼中定義。因此肯定是MAX_PATH的值,它被用來定義char數組binaryPath

按照上述約定,在GetModuleFilename的調用後存儲在該數組中的字符串將被終止。爲了得到它的長度,你需要計算它中的字符,直到達到空字符或使用C庫提供的函數。

一些指針: