在函数的输入参数中将 char 数组替换为 std::string

Substitute char array with std::string in an input parameter to a function

本文关键字:替换 数组 std string char 函数 输入 参数      更新时间:2023-10-16

以下是两个遗留例程。我无法更改例行声明。

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 数组。我无法正确理解语义(字符串::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::stringc_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());