2015-09-02 2 views
4

Мне нужно использовать массив строк с неизвестным размером. Здесь у меня есть пример, чтобы убедиться, что все работает нормально. Мне нужно знать размер этого массива в ClassC, но не передавая это значение в качестве аргумента. Я вижу так много способов сделать это (здесь и в google), но, как вы сейчас увидите, они не сработали. Они возвращают количество символов в первой позиции массива.C++ получение размера массива строк

void ClassB::SetValue() 
{ 
    std::string *str; 
    str = new std::string[2]; // I set 2 to do this example, lately it will be a value from another place 
    str[0] ="hello" ; 
    str[1] = "how are you"; 
      var->setStr(str); 
} 

Теперь в ClassC если я отладки, strdesc[0] ="hello" and strdesc[1] = "how are you", так что я полагаю, что класс С получать информацию ок ....

void classC::setStr(const std::string strdesc[]) 
{ 
    int a = strdesc->size(); // Returns 5 
    int c = sizeof(strdesc)/sizeof(strdesc[0]); // Returns 1 because each sizeof returns 5 
    int b=strdesc[0].size(); // returns 5 

    std::wstring *descriptions = new std::wstring[?]; 
} 

Так .. в classC, как я могу знать, strdesc-х размер массива, который должен вернуть 2 ?? Я также попытался с:

int i = 0; 
while(!strdesc[i].empty()) ++i; 

, но после того, как i=2 программа вылетает с ошибкой сегментации.

Спасибо,

Редактировать с-плюсом РЕШЕНИЯ:

Заключение: Там нет никакого способа узнать размер массива, когда я передать его указатель на другую функцию

  1. Передайте размер к этой функции ... или ...
  2. Используйте векторы с классом std :: vector.
+4

использовать 'std :: vector '. – user463035818

+0

Нет (стандартного) способа получить размер, который у вас есть только указатель, вам нужно отслеживать его самостоятельно. И выполнение 'sizeof' на указателе даст вам размер указателя (обычно 4 на 32-битных системах и 8 на 64-битных системах). –

+0

Вы не можете, если вы не передадите его как тип, где известен размер (fx 'std :: vector ' или 'const std :: string strdesc [2]'). – skyking

ответ

1

, как я могу знать strdesc в размер массива

Вы не можете знать размер массива из указателя на этот массив.

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

но после i = 2 программа вылетает с ошибкой сегментации.

Доступ за пределы границы массива имеет неопределенное поведение.

+0

«Доступ за пределы границы массива имеет неопределенное поведение». Именно это я и предположил, но нашел это как решение здесь, поэтому я попытался ... тогда я понимаю, что я просто могу передать размер или использовать вектор, правильно? – Megasa3

+1

Ну, если вы хотите быть глупым, вы можете потребовать, чтобы пользователь 'classC :: setStr' всегда передавал массив, который всегда заканчивается пустой строкой. В этом случае ваш цикл while будет работать. Например: пользователь хочет передать «привет» и «мир». Поэтому он создал массив со строками {«привет», «мир», «»}. Тогда ваш цикл выяснит, что в массиве есть 2 допустимые строки, потому что третий пуст. Конечно, это потерпело бы неудачу, если пользователь функции попытается передать массив без пустых строк или если пустые строки должны рассматриваться как допустимый ввод. Вместо этого я рекомендую вектор. – user2079303

1

С таким кодом вы получите утечки памяти и другие проблемы типа C.

использование вектора:

#include <vector> 
    #include <string> 
    #include <iostream> 
    ... 
    std::vector<std::string> my_strings; 
    my_strings.push_back("Hello"); 
    my_strings.push_back("World"); 

    std::cout << "I got "<< my_strings.size() << " strings." << std::endl; 

    for (auto& c : my_strings) 
      std::cout << c << std::endl; 
+0

Это была моя первая идея, и на самом деле я сделал это с помощью векторов, но подумал, что массив будет лучше ... так что мне придется передать 'std :: vector * myvector' в качестве параметра в classc? – Megasa3

+1

Нет, просто передайте ссылку или перейдите по значению. C++ 11 имеет семантику перемещения. (без глубокой копии). Массивы C-Style не очень приятны в управлении. Если вам нужен массив, используйте std :: array . –

+0

Я тоже посмотрю на него, не знал, что существует std :: массив с фиксированным размером. Спасибо – Megasa3

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