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

时间:2014-02-28 16:27:28

标签: c++ arrays function char

以下是两个遗留例程。我不能改变例行声明。

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)。

4 个答案:

答案 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::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());