我试图从一个函数返回一个字符串/ 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。 任何想法?
由于
答案 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)
我会将你的问题分成几个我将简要描述的案例。
如果您创建一个本地数组,即char Name[100]
并将其返回,则最终会得到一个dangling pointer
。 Name[100]
是一个automatic
变量,这意味着一旦函数超出范围,函数返回的pointer
将指向无效的内存位置。
return Name
是Name
时, std::string
。好吧,这里有一个类型不匹配。您的函数返回char*
并返回std::string
。因此,您的编译器会发出错误。
要解决您的问题,请将Name
声明为std::string
并声明该函数返回std::string
,如下所示:std::string foo(void)
。
答案 2 :(得分:0)
在第一种情况下,你可能应该返回一个string
(即std::string foo(void) { ... }
),然后只需使用string::c_str()
就可以在需要时从中获取C风格的字符串。
在第二种情况下,编译器完全正确。在范围结束后,您无法安全地使用变量,这将是未定义的行为。当函数退出并且你将指针返回到它的第一个字符时,char
数组不再存在,一个大的no = -no。