2013-04-17 62 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库提供的函数。

一些指针: