代码之家  ›  专栏  ›  技术社区  ›  p3tter

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

  •  0
  • p3tter  · 技术社区  · 8 年前

    im试图从函数返回字符串/字符(两个都尝试过):

     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*” return名称;

    如果我使用char Name[100]; 我在编译程序时收到以下警告:

    /home/peter/netsend/main。cpp:13:警告:局部变量的地址 “Name”返回[-Wreturn本地地址] ^

    当我运行它时,我得到:

    键入您的姓名: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);
    

    然后我可以在intmain中的其他函数中使用Name。 有什么想法吗?

    谢谢

    3 回复  |  直到 8 年前
        1
  •  1
  •   Cheers and hth. - Alf    8 年前

    只需返回一个 string ,如下所示:

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

    或者使用旧语法代替C++11的“尾随返回类型”语法

    std::string foo()
    

        2
  •  0
  •   KostasRim    8 年前

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

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

    2. return Name 什么时候 Name 是一个 std::string char* 然后返回一个 标准::字符串 。因此,编译器会发出错误。

    要解决问题,请声明 名称 作为一个 标准::字符串 并声明函数以返回 标准::字符串 这样地: std::string foo(void) .

        3
  •  0
  •   paxdiablo    8 年前

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

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