以下是两个遗留例程。我不能改变例行声明。
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);
我想使用std :: string作为输入,而不是使用固定的char数组。我无法正确获取语义(string :: c_str)。
答案 0 :(得分:1)
使用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;
}
答案 1 :(得分:0)
您不能将c_str
用于第一个函数,因为它返回const char*
。您可以通过引用传递std::string
并分配给它。至于为空,您可以在字符串上调用c_str
,但您最好调用成员empty()
。
答案 2 :(得分:0)
我认为你可以使用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()) ;
答案 3 :(得分:0)
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());