2017-02-09 4 views
0

О чем я работаю:
Здравствуйте. В настоящее время у меня есть переменная char**, которая является указателем на массив строк. У меня есть цикл, который встречается, и в этом цикле char** необходимо скопировать в вектор structs. Таким образом, структура имеет переменный тип char ** внутри него.
К сожалению, для этой части я должен использовать тип char**. Я не могу использовать тип char* vName[].Как скопировать значения данных в char ** в новый символ **?

Что моя проблема:
Проблема я в настоящее время сталкивается в том, что, когда я добавить новую-структуру, то char** указывает на новейших данных, имеющихся во всех структурах, а не самая последняя.

То, что я пробовал:
Я попытался с помощью strcpy, memcpy и используя простые старые значения, но они, кажется, не работают. Я пробовал использовать newItem.storedVars[i] = newVars, но это тоже не работает.

Как я могу получить или скопировать данные в новый массив char** и сохранить его в структуре без его повторного изменения петлей?

#include <iostream> 
#include <string> 
#include <vector> 

using namespace std; 

struct StringHolder{ 
    char** storedVars;        //stored char** variable 
}; 

int main(int argc, char *argv[]){ 
    char** newVars;         //stores current char** values 
    int counter = 100;        //counter 
    vector<StringHolder> vectorOfStructs; 

    while(counter!=0){        //while counter is going downward 
     StringHolder newItem;      //create a new string 
     char** storedVarsToAdd;      //stored variables that I will be adding 

     newVars = externalVarsFetcher();   //get the new char** variable from the external function 

     storedVarsToAdd = newVars;     //this statement doesn't work 

     //neither does this statement 
     for(int i = 0; i < 10; i++){ 
      storedVarsToAdd[i] = newVars[i]; 
     } 
     newItem.storedVars = storedVarsToAdd;  //take the new item I created, update it's char** value with a new one 
     vectorOfStructs.push_back(newItem);   //push the struct onto the vector 
     counter--;         //continue through the array 
    } 
} 
+0

Магазин 'std :: string' в вашем' vector': 'vector vectorOfStrings;' –

+0

Что означает «это заявление не работает»? Вы имеете в виду, что он не компилируется или что он не делает то, что вы ожидаете, или сбой вашего приложения. – pm100

+0

Вы просто копируете указатели вокруг ... подумайте о том, какой тип хранимыхVarsToRead и storedVarsToRead [i]. Вы даже не выделили память для сохраненногоVarsToRead –

ответ

2

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

Если вы должны использовать char** и т.д .:

for(int i = 0; i < 10; i++){ 
    storedVarsToAdd[i] = strdup(newVars[i]); 
} 

strdup будет выделять память и скопировать строку для вас.

Теперь у вас есть потенциальная утечка памяти, но это другая проблема (подсказка - используйте std::string).

+1

C++ w/o 'std :: string' не является C++. И 'vector' в порядке, но не' string'? –

+0

наверняка, но «учителя» CS любят говорить «не использовать функцию, x, y, z». Заметьте, он говорит, что ему не разрешено использовать char * [] – pm100

+0

Я рад, что вы положили * учителей * в пугающие цитаты. :-) –

2

Вот как хранить аргументы командной строки, что то же самое, что вы пытаетесь сделать:

std::vector<std::string> args; 
for (int i=0; i<argc; i++) 
    args.push_back(argv[i]); 
+0

Мне нужно, чтобы они хранились в той же структуре данных, что и вход. Так что мне нужно, чтобы он хранился в переменной char **. –

+0

Ваш код на самом деле ничего не делает ... возможно, [mcve] поможет? –