Присвоение значения указателю на const указатель на const char (const char * const * p) - PullRequest
0 голосов
/ 11 июня 2018

Я новичок в C ++ и пытаюсь заставить работать следующий код:

struct Keywords
{
     const char* const* keys;
     int count;
}

Keywords GetKeywords()
{
     Keywords keywords;
     keywords.count = 10;
     string keys = "a b c d e";
     keywords.keys = keys???;
     return keywords;
}

int main(int argc, char *argv[])
{
     Keywords keywords = GetKeywords();
     cout<<keywords.count<<endl; //prints 10
     cout<<keywords.keys<<endl;  //prints a memory address like 0030F838
}

Как я могу заставить keys указывать на a b c d e?До сих пор я пробовал это

char * writable = new char[keys.size() + 1];
strcpy(writable, keys.c_str());
writable[keys.size()] = '\0';

const char* a = writable;
const char** ptr = &a;
results.keys = ptr;

Во время отладки я вижу, что results.keys показывает a b c d e, но как только возвращается GetKeywords(), results.keys указывает на нечитаемую область памяти.

Я не могу вносить изменения в struct Keywords и GetKeywords() подпись метода.

1 Ответ

0 голосов
/ 18 июня 2018

Принимая во внимание подсказки Некоторые программисты чувак , Майлз Буднек и другие, я смог решить проблему, как описано ниже:

В моем оригиналевопрос, ключи были представлены string keys = "a b c d e";.Но в задании, над которым я работаю a b c d e, было построено итерирование по set<string> элементам.Вот как это делается:

struct Keywords
{
    const char* const* keys;
    int count;
}

Keywords GetKeywords()
{
    Keywords keywords;
    keywords.count = 5;

    set<string> keys;
    GetKeys(keys);//returns keys = {"a", "b", "c", "d", "e"}

    char** charKeysPtr = new char *[keys.size() + 1];
    set<string>::iterator it;
    int index = 0;

    //Iterate the set and copy each key
    for (it = keys.begin(); it != keys.end(); it++)
    {
        charKeysPtr[index] = new char[it->size() + 1];
        strcpy(charKeysPtr[index], it->c_str());
        charKeysPtr[index][it->size()] = '\0';
        index++;
    }

    keywords.Keys = charKeysPtr;

    return keywords;
}

int main(int argc, char *argv[])
{
     Keywords keywords = GetKeywords();

     //Print keys
     for (int i = 0; i < keywords.count; ++i)
        cout << keywords.keys[i] << " ";

     //Output is "a b c d e"

     //Memory cleanup and etc.
}

Спасибо, ребята!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...