繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM