Проблемы с преобразованием строки c ++ в const char * - PullRequest
0 голосов
/ 19 сентября 2019

Я пытаюсь сделать указатель на постоянный символьный массив из строки c ++.В последних четырех строках я добавляю три строки в одну строку.Это следует использовать для создания указателя на постоянный массив.Этот указатель должен быть возвращен для использования в другой функции.Когда я отлаживаю шаг за шагом, «cout» в конце функции показывает правильное поведение.Когда я смотрю на возвращаемое значение в основной функции, оно указывает на мусорные данные.Что я делаю не так при возврате указателя?

const char *checkMultiID(void){
    string startID = "USB0::0x2A8D::0x0101::";
    string usbID = "MY54500604";
    string endID = "::0::INSTR";
    char answerID;
    int correctFunctionInput = 0;

    cout << "ID = " << usbID << "? [Y/N]" << endl;
    scanf("%c", &answerID);

    while(correctFunctionInput == 0){
        if ((answerID == 'Y') || (answerID == 'N')){
            correctFunctionInput = 1;
        }
        else{
            cout << "Incorrect Input. Please repeat." << endl;
            scanf("%c", &answerID);
        }
    }

    if (answerID == 'N'){
        cout << "Please Type in the ID like MY..." << endl;
        getline (cin, usbID);
    }

    string fullID = startID + usbID + endID;
    const char *idChar = &fullID[0];
    cout << idChar << endl;

    return idChar;
}

Ответы [ 2 ]

0 голосов
/ 19 сентября 2019

Вы возвращаете указатель на данные, которые обрабатываются контейнером, поэтому строка c ++, которая выходит из области видимости, поэтому в конце функции деконструируется.То, что вы хотите сделать, чтобы получить точное поведение, которое вы описываете, это использовать выделение кучи, например так:

char* result = new char[fullID.length()+1];
std::copy(string.c_str(),string.c_str()+fullID.length()+1,result);

Что вам нужно, это вернуть строку c ++ напрямую, потому что я гарантирую, что вы забудетев конце концов освободите эту строку.

const string checkMultiID(){
  return fullID;
}
0 голосов
/ 19 сентября 2019

Вы можете добавить статическое ключевое слово к fullID, например:

static string fullID = startID + usbID + endID;

Лучше было бы просто вернуть строку.

Редактировать:

1201programalarm верно.

Чтобы избежать этого, вы можете сделать:

static string fullID;
fullID  = startID + usbID + endID;

В этом случае после второго вызова checkMultiID () значение из первого вызова будет удалено.

Если вы измените тип возвращаемого значения функции на std :: string, то вы можете просто вернуть fullID и в другой вызов функции c_str () для возвращаемой строки.

const char * result = checkMultiID().c_str();

Это решит вашу проблему, и это самое простое решение.

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