2013-04-17 5 views
3

Я пытался вычислить количество элементов в массиве, и сказал, что линияКак вычислить количество элементов в массиве символов?

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 (в байтах? Биты? ИДК, может кто-нибудь объяснить это тоже?) Из 260. линии

sizeof(binaryPath[0]); 

дает значение 1.

Очевидно то, делящей 260 по одному дает результат 260, WH ich не число элементов в массиве (по моему счету это 42 или около того). Может кто-нибудь объяснить, что я делаю неправильно?

У меня есть подозрительное подозрение, что на самом деле это не массив, как я думаю об этом (я родом из Java и python), но я не уверен, поэтому я прошу вас, ребята.

Спасибо!

+0

Как я уже сказал в ответ на это: http://stackoverflow.com/questions/16049936/cant-output-int -as-result-of-sizeof Но мне сказали, что это неправильный ответ, потому что это не имеет никакого отношения к тому, почему ваш код рушился. Возможно, вы хотели бы вернуться к этому вопросу и объяснить (в случае, если кто-то другой сталкивается с подобным прогрессом), какое исправление было ... –

+0

В совершенно другой заметке вы писали 'using namespace std;' there, или был ли он каким-то инструментом? Просто ищу информацию, никаких суждений. –

+0

Число элементов вашего массива 'char' -' MAX_PATH'. Это так просто. – juanchopanza

ответ

5

Если вы ищете размер строки, то вам нужно использовать strlen, если вы используете sizeof он расскажет вам, выделенную сумму не размер, оканчивающийся нуль строки:

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

Вы будете необходимо добавить #include <cstring> наверху.

7

260 is MAX_PATH, который вы получаете, потому что sizeof возвращает размер всего массива - не только размер строки внутри массива.

Чтобы получить поведение, которое вы ищете, используйте strlen вместо:

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

Вы путаете размер массива с длиной строки она содержит. sizeof(arrayVar) дает вам весь размер массива независимо от того, сколько времени оно содержит. Чтобы определить фактическую длину содержащейся в ней строки, вам необходимо использовать strlen().

3

Вспомните, что массивы char в C++ и C используются для хранения необработанных строк символов и что конец таких строк отмечен нулевым символом.

Оператор sizeof является не динамический: это даст вам размер всего массива, или в зависимости от того типа вы предоставите в байтах(или полукокса, так как они имеют одинаковый размер), как определено в коде , Следовательно, , безусловно, является значением MAX_PATH, которое используется для определения массива символов binaryPath.

Строка, которая хранится в этом массиве после вызова GetModuleFilename, будет иметь нулевое завершение, как указано выше.Чтобы получить свою длину, вам нужно подсчитать символы в ней до тех пор, пока не достигнете нулевого символа или не используйте функцию strlen, предоставленную библиотекой C.

Некоторые указатели:

Смежные вопросы