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()
…意思是一样的,而且更常见,但不能在所有情况下都使用。
我会把你的问题分成几个案例,我会简单描述一下。
如果您创建一个本地数组,即 char Name[100]
和 return,您最终会得到一个 dangling pointer
。 Name[100]
是一个 automatic
变量,这意味着一旦函数超出范围,函数 return 编辑的 pointer
将指向无效的内存位置。
return Name
当 Name
是 std::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。
我正在尝试从一个函数 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()
…意思是一样的,而且更常见,但不能在所有情况下都使用。
我会把你的问题分成几个案例,我会简单描述一下。
如果您创建一个本地数组,即
char Name[100]
和 return,您最终会得到一个dangling pointer
。Name[100]
是一个automatic
变量,这意味着一旦函数超出范围,函数 return 编辑的pointer
将指向无效的内存位置。return Name
当Name
是std::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。