2014-01-07 3 views
0

Я очень новичок в этом форуме и C++. Поэтому простите меня за мои сомнения/вопросы. Я пытаюсь читать std::string. Я знаю, что могу получить доступ к элементам с помощью оператора at или [int]. У меня 2 вопроса:Чтение std :: string, удалить все специальные символы из std :: string

1) удалить или стереть все специальные символы из строки (включая пробелы)

2) для чтения только первые 4 символа или буквы из этой строки

Для 1), я проверяя по std::erase и std::remove_if, но мне нужно устранить все, что я имею в виду, специальные символы и пробелы. Это означает, что мне нужно включить все условия, которые isspace()/isalpha() и так далее. Нет ли единого метода для удаления всех сразу?

Для 2) я могу получить доступ к строке, как массив, я имею в виду строку [0], строку [1], строку [2], строку [3]. Но я не могу добавить это в одну строку?

Пожалуйста, дайте мне знать, как я могу это достичь?

+0

Какие символы являются «специальными символами»? – zch

+0

Да, я имею в виду все во втором ряду наших клавиатур. – johnkeere

ответ

3

Чтобы получить первые четыре символа:

std::string first4=str.substr(0, 4); 

Чтобы удалить все, что isspace и IsAlpha предикаты (хотя я думаю, что я понял, здесь, вы имеете в виду isspace и не ISALPHA ??):

str.erase(std::remove_if(str.begin(), str.end(), 
    [](char c) { return std::isspace(c) || std::isalpha(c); }), 
    str.end()); 

Вы можете добавить строку, используя op+=. Например:

str+="hello"; 
str+='c'; 
0

Чтобы удалить все специальные символы, то почему бы не сделать метод следующим образом:

bool isLegal(char c) 
{ 
    char legal[] = {'a', 'A', 'b','B' /*..and so on*/}; 
    int len = sizeof(legal)/sizeof(char); 

    for (int i = 0; i < len; i++) 
    if (c == legal[i]) 
     return true; 
    return false; 
} 

, а затем просто перебирать корыта строку и удалить символы не законно?

0

Для 1: std :: remove_if удаляет все элементы, для которых данный предикат возвращает true. Вы предоставляете объект функции предиката, и он может быть тем, что вы хотите, до тех пор, пока он принимает элемент из вашего контейнера (char) и возвращает bool.

Таким образом, вы можете написать функцию, такую ​​как:

bool IsNotLegal(const char & stringElement); 

или вы можете записать его в виде лямбда-функции, а затем вы можете передать его StD :: remove_if, чтобы удалить все из строки, которая удовлетворяет вашим условия в 1 проход.

std::string myString{"This is my string."}; 
std::remove_if(std::begin(myString), std::end(myString),[](const char & element) 
{ 
    return std::isspace(element) && //any other conditions such as your own IsSpecial(); 
}); 
// now myString has become "Thisismystring." 
Смежные вопросы