Поэтому мне нужно создать функцию, которая удаляет все небуквенные и непространственные символы символов из строки символов (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 был украден!"
Пожалуйста помоги!
После одной линии После этого цикла
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]
, поэтому необходимо уменьшить значение индекса.
Следующий код игнорирует все пробелы и удаляет все несимволы:
#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;
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;
}
Когда вы отбрасываете персонажа, вы копируете следующий символ поверх него, но затем вы хотите рассмотреть, следует ли отбрасывать следующий символ. Для этого вам необходимо избегать ++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;
}
Когда вы найдете непространственный и не-альфа-символ, вы перемещаете всю строку, оставленную одним местом, после чего я увеличивается и больше не указывает на новый символ, который попал в ненужное место персонажа. Поэтому, если есть последовательные нежелательные символы (без пробела и не альфа) ваш код не сможет его обнаружить.