c ++: использование string.erase для символа * - PullRequest
1 голос
/ 08 марта 2012

говорят, что у меня есть указатель, указывающий на char array как образец в программе:

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

, а затем я хочу избавиться от этого 1

Я используюцикл, такой как

while(i<strlen(input))
{


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

}

что-то смутно подобное, я просто не уверен, как использовать строковые функции c ++ на ... указателе символа?Я понимаю, что в c ++ строка - это просто массив символов, однако точное использование и то, что мне еще не дошло.

Ответы [ 3 ]

3 голосов
/ 08 марта 2012

что-то смутно подобное, я просто не уверен, как использовать строковые функции c ++ на ... указателе символа?

Ты не можешь. Не напрямую. Если вы хотите работать со строками в стиле char*, вы должны использовать функции из заголовка <cstring>. Но есть несколько деталей, которые нужно отслеживать, если вы используете эти функции, поэтому я не рекомендовал бы это вообще.

Я понимаю, что в C ++ эта строка является просто массивом символов,

Это утверждение почти верно. std::string предназначен для замены char* строк, и поэтому он может делать все, что угодно char*, а затем и некоторые. std::string имеет, по крайней мере, char*, который указывает на буфер, длину его буфера и вторую длину того, сколько этого буфера было использовано. Есть хороший шанс, что у него также есть меньший буфер внутри самого объекта («оптимизация небольших строк»), и приличный шанс, что у него есть какой-то счетчик ссылок (Стандарт написан, чтобы сделать «копирование при записи» легальной реализацией). и многие реализации используют это преимущество, , хотя это может быть неправильным подходом ).

Если вы хотите использовать 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 голос
/ 08 марта 2012

Преобразуйте строку в стиле c в std::string следующим образом:

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

Теперь вы можете использовать стандартные строковые функции C ++ для манипулирования этой строкой, например сотрите , как вы пытаетесь сделать во фрагменте кода.

0 голосов
/ 08 марта 2012

Если вы не хотите конвертировать в CString, вы также можете использовать функции std: string, см. Ссылку ниже:

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

...