c ++从用户输入返回字符串或char

时间:2016-09-04 11:00:23

标签: c++ string qt return-value cin

我试图从一个函数返回一个字符串/ char(尝试过两者):

 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}'to   'char *'作为回报        返回姓名;               ^

如果我使用char名称[100]; 我编译程序时收到此警告:

  

/home/petter/netsend/main.cpp:13:警告:局部变量的地址   'name'返回[-Wreturn-local-addr]        char名称[100];             ^

当我运行它时,我得到:

  

你的名字:hh在抛出一个实例后终止调用   'std :: logic_error'what():basic_string :: _ M_construct null not not   有效中止(核心转储)

如果我直接在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);

然后我可以在int main中的其他函数中使用Name。 任何想法?

由于

3 个答案:

答案 0 :(得分:1)

只需返回string,就像这样:

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

或者代替C ++ 11&#34;尾随返回类型&#34;语法,使用旧语法

std::string foo()

......这意味着相同但仍然更常见,但不能在每种情况下使用。

答案 1 :(得分:0)

我会将你的问题分成几个我将简要描述的案例。

  1. 如果您创建一个本地数组,即char Name[100]并将其返回,则最终会得到一个dangling pointerName[100]是一个automatic变量,这意味着一旦函数超出范围,函数返回的pointer将指向无效的内存位置。

  2. return NameName时,
  3. std::string。好吧,这里有一个类型不匹配。您的函数返回char*并返回std::string。因此,您的编译器会发出错误。

  4. 要解决您的问题,请将Name声明为std::string并声明该函数返回std::string,如下所示:std::string foo(void)

答案 2 :(得分:0)

在第一种情况下,你可能应该返回一个string(即std::string foo(void) { ... }),然后只需使用string::c_str()就可以在需要时从中获取C风格的字符串。

在第二种情况下,编译器完全正确。在范围结束后,您无法安全地使用变量,这将是未定义的行为。当函数退出并且你将指针返回到它的第一个字符时,char数组不再存在,一个大的no = -no。