c ++:在char *上使用string.erase

时间:2012-03-08 06:29:55

标签: c++ string erase arrays

说我有一个指向char array的指针,就像程序中的样本一样:

string input = "bo1b";
char* = &input;

然后我想摆脱那个1

我使用了一个循环,例如

while(i<strlen(input))
{


if (!isalpha(input[i]))
{
input.erase(i,1) <------?

}
像这样的东西 我只是不确定如何在c ...指针上使用c ++字符串函数? 我确实理解在c ++中,一个字符串只是一个字符串数组,但确切的用法和仍未通过我的字符串。

3 个答案:

答案 0 :(得分:3)

  某些东西,我只是不确定如何使用c ++字符串函数......一个字符指针?

你做不到。不是直接的。如果要对char* - 样式字符串进行操作,则必须使用<cstring>标题中的函数。但是有几个细节可以跟踪你是否使用这些功能,所以我不建议这样做。

  

我确实理解在c ++中字符串只是一个char数组,

这种说法几乎是正确的。 std::string旨在替换char*字符串,因此它可以执行char*之后的所有操作。 std::string至少有char*指向缓冲区,缓冲区的长度,以及该缓冲区使用了多少的第二长度。它很可能在对象本身内部有一个较小的缓冲区(“小字符串优化”),并且它有一定的机会它有某种引用计数(标准是为了使“写入时复制”成为合法的实现,许多实现都利用了这一点,although that may not be the right approach)。

如果您想使用std::string方法,则需要std::string,这很容易制作:

std::string foo(input);
while (i < foo.size()) {
    if (!std::isalpha(foo[i])) {
        foo.erase(i, 1);
    }
}

就个人而言,我会写(在C ++ 0x中):

std::string foo("hello 123");
auto itor = std::remove_if(foo.begin(),
                           foo.end(),
                           [](char c){ return !std::isalpha(c); });
foo.erase(itor, foo.end());

或者:

std::string foo;
std::copy_if(input,
             input + strlen(input),
             std::back_inserter(foo),
             std::isalpha);
// foo now contains what you were looking for

很多人更喜欢使用std::string方法,所以我不能说我的方法必然更好。

答案 1 :(得分:1)

将c样式字符串转换为std::string,如下所示:

std::string stringToEdit( cString );
// The constructor of a std::string can take a char* (c-style string)

现在,您可以使用standard C++ string functions来操纵此字符串,例如erase,就像您尝试在代码段中进行操作一样。

答案 2 :(得分:0)

如果您不想转换为CString,也可以使用std:string函数,请参阅以下链接:

http://www.cplusplus.com/reference/string/string/