cStrings Удалите не-буквенный / непробельный символ - C ++

0

Поэтому мне нужно создать функцию, которая удаляет все небуквенные и непространственные символы символов из строки символов (c-string).

Например: "Я расстроен тем, что 15 ноября 2014 года мои 2 новых BMW 750L были украдены!" следует превратить в "я расстроен тем, что на нове мой бренный битва был украден".

documentCopy[201] = "I'm upset that on Nov. 15th, 2014, my 2 brand-new BMW 750Lis were stolen!!";

for (int i = 0; documentCopy[i] != '\0'; i++)
{
    if (!isalpha(documentCopy[i]) && !isspace(documentCopy[i]))
    {

        for (int k = i; documentCopy[k] != '\0'; k++)
        {
            documentCopy[k] = documentCopy[k+1];

        }
    }
}
cout << documentCopy << endl;

К сожалению, выход "Im расстроен, что 5 ноября 04 года мой новый BMW 5Lis был украден!"

Пожалуйста помоги!

Теги:
c-strings
cstring

5 ответов

1
Лучший ответ

После одной линии После этого цикла

for (int k = i; documentCopy[k] != '\0'; k++)
{
    documentCopy[k] = documentCopy[k+1];
}
i--;  //Add This line in your Code.

Это сработает.

например
если вы проверяете a[0] и смещаете a[0] = a[1]
Поэтому вам нужно снова проверить a[0] потому что теперь он удерживает значение a[1], поэтому необходимо уменьшить значение индекса.

2

Следующий код игнорирует все пробелы и удаляет все несимволы:

#include <iostream>
#include <algorithm>
#include <string>
using namespace std;

int main() {

    std::string str = "I'm upset that on Nov. 15th, 2014, my 2 brand-new BMW 750Lis were stolen!!";
    str.erase(std::remove_if(str.begin(), str.end(), [](const unsigned &c){ return !isspace(c) && !isalpha(c);}), str.end());
    std::cout << str;
    return 0;
}

Выход будет:

Im расстроился, что на ноябрь мой новый BMW Lis был украден

Вы также можете использовать remove_if для C-строк, если вам нужно:

char cstring[] = "I'm upset that on Nov. 15th, 2014, my 2 brand-new BMW 750Lis were stolen!!";
int count = 0;
std::remove_if(cstring, cstring+sizeof(cstring), [&count](const unsigned char &c)
                                            {
                                                if (!isspace(c) && !isalpha(c))
                                                {
                                                    ++count;
                                                    return true;
                                                }
                                                else
                                                    return false;                               
        });

cstring[sizeof(cstring) - count] = 0;

std::cout << cstring;
1
void Voila()
{
    char documentCopy[] = "I'm upset that on Nov. 15th, 2014, my 2 brand-new BMW 750Lis were stolen!!";
    char* psrc = documentCopy;
    char* pdst = documentCopy;

    for( ; *psrc; ++psrc)
    {
        if (isalpha(*psrc) || isspace(*psrc))
            *pdst++ = *psrc;
    }
    *pdst = 0;
    cout << documentCopy << endl;
}
1

Когда вы отбрасываете персонажа, вы копируете следующий символ поверх него, но затем вы хотите рассмотреть, следует ли отбрасывать следующий символ. Для этого вам необходимо избегать ++i в таких обстоятельствах, то есть:

for (int i = 0; documentCopy[i] != '\0'; )
{
    if (!isalpha(documentCopy[i]) && !isspace(documentCopy[i]))
    {

        for (int k = i; documentCopy[k] != '\0'; k++)
        {
            documentCopy[k] = documentCopy[k+1];
        }
    }
    else
        ++i;
}
0

Когда вы найдете непространственный и не-альфа-символ, вы перемещаете всю строку, оставленную одним местом, после чего я увеличивается и больше не указывает на новый символ, который попал в ненужное место персонажа. Поэтому, если есть последовательные нежелательные символы (без пробела и не альфа) ваш код не сможет его обнаружить.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню