我试图计算数组中元素的数量,并被告知该行
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返回的大小(以字节为单位?id?idk,有人可以解释一下吗?)260.该行
sizeof(binaryPath[0]);
给出值1。
显然然后将260除以1会得到260的结果,这不是数组中元素的数量(据我所知,它是42左右)。有人可以解释我做错了吗?
我有一个潜行的怀疑,实际上并不是我想到的阵列(我来自Java和python),但我不确定所以我问你们。
谢谢!
答案 0 :(得分:7)
260是MAX_PATH
,你得到的是因为sizeof
返回整个数组的大小 - 而不仅仅是数组中字符串的大小。
要获得您正在寻找的行为,请改为使用strlen
:
cout << "binaryPath: " << binaryPath << endl;
cout << "strlen(binaryPath): " << strlen(binaryPath) << endl;
答案 1 :(得分:5)
如果要查找字符串的大小,则需要使用strlen
,如果使用sizeof
,它将告诉您分配的数量不是空终止字符串的大小:
std::cout << "strlen(binaryPath: " << strlen(binaryPath) << std::endl;
您需要在顶部添加#include <cstring>
。
答案 2 :(得分:3)
您将数组的大小与其包含的字符串的长度混淆。无论数组包含多长时间,sizeof(arrayVar)
都会为您提供整个数组大小。您需要使用strlen()
来确定它包含的字符串的实际长度。
答案 3 :(得分:3)
回想一下,C ++和C中的char数组用于存储原始字符串,并且这些字符串的结尾用空字符标记。
运算符sizeof
非动态:它会为您提供整个数组的大小,或者您提供的字节数(或char,因为它们具有相同的大小),如代码中所定义。因此 260 肯定是MAX_PATH
的值,用于定义char数组binaryPath
。
根据上述惯例,在调用GetModuleFilename
之后存储在该数组中的字符串将被终止。为了获得它的长度,你需要计算它中的字符,直到你到达null char或使用C库提供的strlen
函数。
一些指示: