![](/img/trans.png)
[英]Is it safe to convert function parameter `const char*` to `std::string_view`?
[英]Substitute char array with std::string in an input parameter to a function
以下是两个遗留例程。 我不能更改例程声明。
static bool GetString(char * str); //str is output parameter
static bool IsStringValid(const char * str); //str is input parameter
如下致电
char inputString[1000];
GetString(inputString);
IsStringValid(inputString);
我不想使用固定的char数组,而是要使用std :: string作为输入。 我无法正确理解语义(string :: c_str)。
使用IsEmpty
这应该不是问题:
std::string str = "Some text here";
IsEmpty(str.c_str());
虽然如果您有std::string
,这是没有用的,但是通常只需要调用str.empty()
。
但是,其他功能更难。 原因是它的参数不是const
,并且std::string
不允许您使用指针修改字符串。
它可以解决,通过写一个包装-函数,它接受一个字符串参考,并具有用于实际的内部阵列GetString
呼叫,并使用该阵列初始化传递的字符串参考。
包装器示例:
// Function which "creates" a string from scratch
void GetString(std::string& str)
{
char tempstr[4096];
GetString(tempstr);
str = tempstr;
}
// Function which modifies an existing string
void ModifyString(std::string& str)
{
const size_t length = str.size() + 1;
char* tempstr = new char[length];
std::copy_n(str.c_str(), tempstr, length);
ModifyString(tempstr);
str = tempstr;
delete[] tempstr;
}
您不能将c_str
用于第一个函数,因为它返回const char*
。 您可以通过引用传递std::string
并将其分配给它。 至于为空,您可以在字符串上调用c_str
,但是最好将成员称为empty()
。
我认为您可以使用STL(标准模板库)的字符串容器。
#include <string>
bool isempty ( int x ) {
return ( x == 0 ) ? true : false ;
}
// inside main()
string s ;
cin >> s ; // or getline ( cin , s) ;
bool empty = isEmpty (s.length()) ;
std::string
具有c_str()
,您可以将其用于IsEmpty
。 没有提供给您非常量指针的函数。 由于不能保证std :: string的分配是连续的,因此您也不能执行&s[0]
。 您唯一可以做的就是像在示例中一样使用临时char缓冲区。
std::string s;
char inputString[1000];
std::vector<char> v(1000);
GetString(inputString);
GetString(&v[0]);
s = &v[0];
IsEmpty(s.c_str());
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.