Я пытаюсь вернуть строку / символ (пробовал с обоими) из функции:

 char* foo(void)

    {

    using namespace std;
   // char Name[100];
    std::string Name;
    std::cout << "Type your name : ";
    //std::getline(std::cin, Name);
    std::cin >> Name;

    // std::cout << "Hello " << Name << "\n";

   // std::string str(Name);
    return Name;
    }

Что дает мне эту ошибку:

/home/peter/netsend/main.cpp:22: ошибка: невозможно преобразовать 'std :: __ cxx11 :: string {aka std :: __ cxx11 :: basic_string}' в 'char *' в возвращаемом имени; ^

Если я использую char Name [100]; я получаю это предупреждение при компиляции своей программы:

/home/petter/netsend/main.cpp:13: предупреждение: возвращен адрес локальной переменной «Имя» [-Wreturn-local-addr] char Name [100]; ^

Когда я запускаю его, я получаю:

ype ваше имя: hh terminate вызывается после создания экземпляра 'std :: logic_error' what (): basic_string :: _ M_construct null недействительно Прервано (ядро выгружено)

Если я запустил это непосредственно в int main, он работает:

using namespace std;
   // char Name[100];
    std::string Name;
    std::cout << "Type your name : ";
    //std::getline(std::cin, Name);
    std::cin >> Name;

    // std::cout << "Hello " << Name << "\n";

   // std::string str(Name);

Тогда я мог бы использовать Name в других моих функциях в int main. Любые идеи?

Благодарность

0
p3tter 4 Сен 2016 в 14:00

3 ответа

Лучший ответ

Просто верните string, например:

auto foo()
    -> std::string
{
    using namespace std;
    string Name;
    cout << "Type your name : ";
    getline( cin, Name );
    return Name;
}

Или вместо синтаксиса "конечного возвращаемого типа" C ++ 11 используйте старый синтаксис

std::string foo()

… Что означает то же самое и по-прежнему встречается гораздо чаще, но не может использоваться во всех случаях.

1
Cheers and hth. - Alf 4 Сен 2016 в 11:10

Я разделю вашу проблему на случаи, которые опишу кратко.

  1. Если вы создадите локальный массив, а именно char Name[100], и вернете его, вы получите dangling pointer. Name[100] - это переменная automatic, что означает, что как только функция выходит за пределы области видимости, pointer, возвращаемый функцией, будет указывать на недопустимую ячейку памяти.

  2. return Name, когда Name является std::string. Ну вот и несоответствие типов. Ваша функция возвращает char*, а вы возвращаете std::string. Следовательно, ваш компилятор выдает ошибку.

Чтобы устранить проблему, объявите Name как std::string и объявите функцию, возвращающую std::string, например: std::string foo(void).

0
KostasRim 4 Сен 2016 в 11:11

В первом случае вам, вероятно, следует вернуть string (т.е. std::string foo(void) { ... }), а затем просто использовать string::c_str(), чтобы получить из него строку в стиле C, когда / при необходимости.

Во втором случае компилятор совершенно прав. Вы не можете безопасно использовать переменную после того, как ее область действия закончилась, это будет неопределенным поведением. Массив char перестает существовать, когда функция завершается и вы возвращаете указатель на ее первый символ, большой no = -no.

0
paxdiablo 4 Сен 2016 в 11:11