Как посчитать количество общих символов в const char **? - PullRequest
0 голосов
/ 21 октября 2018

Я пытаюсь написать приложение Vulkan с нуля, и у меня возникли проблемы с попыткой подсчитать общее количество символов в

const char**

Мне было интересно, как можно перебирать каждый символкаждой "c строки".Это сделано с целью сравнения существующих расширений экземпляров для создания экземпляра Vulkan.

Это функция, с которой у меня возникают проблемы, и каждая проблема, похоже, связана с тем, что sizeof возвращает размер в байтах, а неколичество элементов.

void Extensions_Manager::GetInstanceExtensionNames(const char** extNames, const char** glfwNames, bool validation)
{
std::string extension = "";

if (validation)
    instanceExtensionNames.push_back(VK_EXT_DEBUG_UTILS_EXTENSION_NAME);


for (int i = 0; i < sizeof(glfwNames); ++i)
{
    if (glfwNames[i] == '\0')
    {
        instanceExtensionNames.push_back(extension.c_str());

        slog("Instance extension to use %s", extension.c_str());

        extension = "";
    }
    else
    {
        extension += glfwNames[i];
    }
}

for (const char* ext : instanceExtensionNames)
{
    slog("Available Extension: %s", ext);
}

extNames = instanceExtensionNames.data();
}


instanceExtensionNames

- статический вектор константного символа *

Ответы [ 2 ]

0 голосов
/ 21 октября 2018

Как посчитать количество общих символов в const char **

Зацикливание каждой строки в указанном массиве.Для каждой строки подсчитайте количество символов.Добавьте длины вместе.

Обратите внимание, что вы можете решить, хотите ли вы подсчитать количество char объектов (т. Е. Кодовых единиц) или количество символьных символов, которые не обязательно совпадаютв зависимости от кодировки символов.

sizeof(glfwNames)

sizeof не имеет ничего общего с "количеством элементов".glfwNames это указатель.sizeof(glfwNames) - размер объекта указателя.Все указатели определенного типа всегда имеют одинаковый размер (в пределах конкретной системы) независимо от объекта, на который они указывают.

Невозможно определить количество элементов, если дан только указатель на элементмассив и никакой другой информации.Это просто невозможно, потому что указатель не содержит необходимой информации.Не зная, когда прекратить итерацию массива, невозможно правильно выполнить итерацию.

Это распространенные способы итерации диапазона (в данном случае это массив) итераторов (указатели являются итераторами длямассивы):

  • Передайте длину диапазона в качестве аргумента и используйте индексированный цикл.Это работает со случайно доступными итераторами, такими как указатели.
  • Передача итератора (в данном случае указателя) в конец (один за последним элементом) диапазона.Этот подход является более общим, поскольку он работает и с итераторами без произвольного доступа.Увеличивайте итератор в цикле, и, как только он достигнет конца, вы узнаете, чего вы достигли.
  • Назначьте определенное значение в качестве элемента-стража (также известного как терминатор).Когда встречается значение часового, вы знаете, что итерация достигла конца диапазона.Этот подход используется для строк с нулевым символом в конце.
  • Примечание: Интересно, что аргументы командной строки (argc + argv) обеспечивают оба способа: argc - длина, ноchar** argv также завершается нулевым указателем.

Если вы получаете glfwNames из библиотеки, обратитесь к документации библиотеки, чтобы узнать, как узнать длину.Если вы контролируете как вызов, так и определение функции, убедитесь, что вы передали в функцию достаточную информацию.

0 голосов
/ 21 октября 2018

строка заканчивается на '\ 0'.

скажем, у вас есть * ptr = "string";

что вы можете сделать здесь:

int i = 0;
while(ptr[i] != '\0')
    i++;
cout << ptr[0];
    return 0;

, который даст вам общее количество символов строки с '\ 0', иначе вы можете использовать strlen (), который находится в string.h lib.

...