2016-09-04 42 views
0

IM返回字符串或字符试图返回从funtion字符串/炭(与两个试过):C++从用户输入

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: error: cannot convert 'std::__cxx11::string {aka std::__cxx11::basic_string}' to 'char*' in return return Name; ^

如果我使用char名称[100]; 当我编译我的程序,我得到这样的警告:

/home/petter/netsend/main.cpp:13: warning: address of local variable 'Name' returned [-Wreturn-local-addr] char Name[100]; ^

当我运行它,我得到:

ype your name : hh terminate called after throwing an instance of 'std::logic_error' what(): basic_string::_M_construct null not valid Aborted (core dumped)

,如果我直接在INT主要运行这个它的工作原理:

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。 有什么想法?

感谢

+0

尝试'返回Name.c_str()' –

+0

因为一个字符串!= char数组。在第一个中,你说你正在返回一个字符指针,但你试着返回一个字符串。将返回类型更改为字符串。并且不要使用大写名称作为变量。大写字母用于类型。 – Carcigenicate

+0

@OrkhanAlikhanov,如果忽略'const'的差异并编译,它会返回一个悬挂指针。 – chris

回答

0

只返回一个string,像这样:

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

或者代替C++ 11 “后返回” 语法,使用旧的语法

std::string foo() 

&hellip;这意味着相同并且仍然更为常见,但不能在任何情况下使用。

0

我会将你的问题划分为我将简要描述的案例。

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

  2. return NameNamestd::string。那么,在这里你有一个类型不匹配。你的函数返回一个char*,你返回std::string。因此,您的编译器会发出错误。

要解决您的问题声明Namestd::string并宣布返回一个std::string这样的功能:std::string foo(void)

0

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

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