2016-03-21 4 views
0

Я понимаю, как найти размер, используя массив строкового типа:Как я могу найти размер массива (* char) внутри функции?

char * shuffleStrings(string theStrings[]) 
{ 
    int sz = 0; 
    while(!theStrings[sz].empty()) 
    { 
     sz++; 
    } 
    sz--; 
    printf("sz is %d\n", sz); 
    char * shuffled = new char[sz]; 
    return shuffled; 
} 

Один из моих вопросов в приведенном выше примере также, почему я должен уменьшать размер на 1, чтобы найти истинное число элементов в массиве? Так что если код выглядит следующим образом:

char * shuffleStrings(char * theStrings[]) 
{ 
    //how can I find the size?? 
    //I tried this and got a weird continuous block of printing 
    int i = 0; 
    while(!theStrings) 
    { 
     theStrings++; 
     i++; 
    } 
    printf("sz is %d\n", i); 
    char * shuffled = new char[i]; 
    return shuffled; 
} 
+0

Что вы пытаетесь выполнить с помощью своего второго вопроса? – Elipzer

+0

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

+0

Я ответил на ваши вопросы. Однако я не уверен, что вы понимаете, что вы пытаетесь с помощью указателя тасования: это будет один символ в строке в таблице и без места для нулевого терминатора. Разве вы не хотите, чтобы общий размер перетасовал в строки? Или вы хотите сохранить в нем индексы перетасованных строк? В последнем случае вы должны рассмотреть 'sizet_t *' вместо 'char *' (или лучше 'vector shuffled (i)'). – Christophe

ответ

0

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

Во втором фрагменте вы работаете с указателем на точку. Таким образом, условие while должно быть *theStrings (предположим, что указатель NULL является маркером для конца вашей таблицы.

Обратите внимание, что в обоих случаях, если таблица не удерживает маркер для конца таблицы, d риск выйти за пределы. Почему бы не работать с vector<string>? Тогда вы могли бы получить размер без петли, а не риск выйти за пределы

0

То, что вы видите здесь, является «прекращение» характер в строке или '\0'

Вы можете видеть это лучше, когда используете строку char * вместо строки.

Вот пример калькулятора размера, который я сделал.

int getSize(const char* s) 
{ 
    unsigned int i = 0; 
    char x = ' '; 
    while ((x = s[i++]) != '\0'); 
    return i - 1; 
} 

Как вы можете видеть, char* завершается с '\0' символа для обозначения конца строки. Это характер, который вы считаете в своем алгоритме, и именно поэтому вы получаете дополнительный характер.

Что касается вашего второго вопроса, кажется, хотите создать новый массив с размером всех строк.

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

+0

Я подозреваю, что OP ищет размер массива строки, а не одну строку. Поэтому он работает с 'char **' и ищет конец маркера таблицы (пустая строка в первом фрагменте, nullptr во втором фрагменте). – Christophe

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