c++ return 来自用户输入的字符串或字符

c++ return string or char from user input

我正在尝试从一个函数 return string/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: error: cannot convert 'std::__cxx11::string {aka std::__cxx11::basic_string}' to 'char*' in return return Name; ^

如果我使用字符名称[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 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。 有什么想法吗?

谢谢

就return一个string,像这样:

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

或者不使用 C++11 "trailing return type" 语法,而是使用旧语法

std::string foo()

…意思是一样的,而且更常见,但不能在所有情况下都使用。

我会把你的问题分成几个案例,我会简单描述一下。

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

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

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

在第一种情况下,您可能应该 return 一个 string(即 std::string foo(void) { ... })然后简单地使用 string::c_str() 从它 when/if 需要。

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