Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Фильтрация символов в строке 
:(
    Опции темы
Rage
  Дата 9.8.2007, 17:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 30.10.2006
Где: Спб

Репутация: 1
Всего: 1



Доброго времени суток!

Меня очень интересует, как можно поумнее реализовать следующий механизм. 
Есть некоторая строка std::string и есть определённый набор символов, которые эта строка может содержать, все остальные символы не допускаются.(Если нужна конкретика, то допустимые символы это заглавные буквы, цифры, знаки тире и  подчеркивания, а все остальные, соответственно, недопустимые) 

Так вот,подскажите,пожалуйста,как  лучше организовать проверку строки на наличие запрещённых символов ?   
Мне в голову кроме полного перебора ничего не лезет... smile 

Спасибо smile



PM MAIL ICQ   Вверх
_hunter
Дата 9.8.2007, 17:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 16
Всего: 98



а кроме полного перебора тут ничего и не придумаеш.
другое дело как хранить/искать разрешенные символы...
самый простой (и довольно быстрый вариант) -- засунуть их в std::set и искать по нему.
для уменьшения числа поисков можно строку в set свернуть (но будет ли это быстрее -- хз. нужно на практике смотреть)


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
Dov
Дата 9.8.2007, 18:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


аСинизатор
***


Профиль
Группа: Завсегдатай
Сообщений: 1721
Регистрация: 10.5.2003
Где: Эрец-Исраэль

Репутация: 15
Всего: 88



В качестве примера могу предложить такой вариант:
Код

string not_possible("qwertyuiopasdfghjklzxcvbnm,./`=~!@#$%^&*{}[]()<>+|;:\"?'");
string str("_QWERTY-2");

if(!strpbrk(str.c_str(), not_possible.c_str()))
    cout << str << endl;
else
    cout << "ERROR!!!\n";




--------------------
Тут вечности запах томительный,
И свежие фрукты дешевые, 
А климат у нас – изумительный, 
И только соседи – #уевые. 
                           Игорь Губерман.
PM   Вверх
TimberWolf
Дата 9.8.2007, 23:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 40
Регистрация: 6.1.2007
Где: Тула

Репутация: нет
Всего: нет



Как вариант ... 

Код

string punct("qwertyuiopasdfghjklzxcvbnm,./`=~!@#$%^&*{}[]()<>+|;:\"?'");
string Lstr = remPunct(str, punct); // str - исходная строка
// Функция remPunct
string remPunct(const string& s, const string& punct) {
string noPunct;
int lenght = s.lenght();

for(int i = 0; i < lenght; i++) {
//Извлечение символа из строки s
string theChar = s.subsrt(i,1);
//Поиск вхождения данного символа в строке
int location = punct.find(theChar, 0);
if(localtion < 0 || location >= lenght)
noPunct += theChar;
}
return noPunct;
}

PM MAIL Jabber   Вверх
Rage
Дата 10.8.2007, 00:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 30.10.2006
Где: Спб

Репутация: 1
Всего: 1




Огромное спасибо всем за помощь. После долгих мук я всё-таки решил сделать вот так, гляньте:

Код


std::string allowedSymbols_="_1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz-";
std::string anyString;

if(anyString.find_first_not_of(allowedSymbols_)!=std::string::npos)

     std::cout<<"Invalid String";

...



Вроде работает.
Можт какие-нить изъяны увидите - пишите!  smile  

PM MAIL ICQ   Вверх
Xenon
Дата 10.8.2007, 01:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1529
Регистрация: 12.4.2006

Репутация: 11
Всего: 50



Rage, Недозволенных символвов по-моему меньше smile Лучше бы их в строку. А так у тебя ищет только первое вхождение - если тебя устраивает, то нормально.


--------------------
user posted image  
PM MAIL   Вверх
Dov
Дата 10.8.2007, 12:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


аСинизатор
***


Профиль
Группа: Завсегдатай
Сообщений: 1721
Регистрация: 10.5.2003
Где: Эрец-Исраэль

Репутация: 15
Всего: 88



Тогда уже так:
Код

int main() 
{
    string not_possible = "qwertyuiopasdfghjklzxcvbnm,./`=~!@#$%^&*{}[]()<>+|;:\"?'";
    string str          = "_QWERTY-2";
    int    found        = str.find_first_of(not_possible) + 1;

    cout << (found ? "ERROR!!!" : str) << endl;

    return 0;    
}



--------------------
Тут вечности запах томительный,
И свежие фрукты дешевые, 
А климат у нас – изумительный, 
И только соседи – #уевые. 
                           Игорь Губерман.
PM   Вверх
akizelokro
Дата 10.8.2007, 12:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Крокодил
**


Профиль
Группа: Участник
Сообщений: 761
Регистрация: 30.7.2007

Репутация: 1
Всего: 5



К примеру, 

str="ёмаё\n". Что выдаст последний вариант?


--------------------
a = a + b; b = a - b; a = a - b;
PM MAIL   Вверх
Dov
Дата 10.8.2007, 13:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


аСинизатор
***


Профиль
Группа: Завсегдатай
Сообщений: 1721
Регистрация: 10.5.2003
Где: Эрец-Исраэль

Репутация: 15
Всего: 88



Цитата(akizelokro @  10.8.2007,  12:27 Найти цитируемый пост)
str="ёмаё\n". Что выдаст последний вариант?

Последний вариант выдаст содержимое строки str, т.е. ёмаё и переведёт курсор на новую строку.  smile  
А что тебя смущает ?  smile 



--------------------
Тут вечности запах томительный,
И свежие фрукты дешевые, 
А климат у нас – изумительный, 
И только соседи – #уевые. 
                           Игорь Губерман.
PM   Вверх
akizelokro
Дата 10.8.2007, 13:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Крокодил
**


Профиль
Группа: Участник
Сообщений: 761
Регистрация: 30.7.2007

Репутация: 1
Всего: 5



Смущает, что созданный каталог будет отображаться на две строки! smile 
А потом, возвращаясь к первоначальной задаче, нужно будет длишу строки отслеживать, иначе его название вылезет за правый край монитора) smile 

 smile 
кстати, str="Новая папка\0";

оно вообще дастся к созданию?


--------------------
a = a + b; b = a - b; a = a - b;
PM MAIL   Вверх
Dov
Дата 10.8.2007, 13:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


аСинизатор
***


Профиль
Группа: Завсегдатай
Сообщений: 1721
Регистрация: 10.5.2003
Где: Эрец-Исраэль

Репутация: 15
Всего: 88



Цитата(akizelokro @  10.8.2007,  13:30 Найти цитируемый пост)
Смущает, что созданный каталог будет отображаться на две строки!

akizelokro, а что мешает добавить символ новой строки '\n' (равно, как и другие, не нужные тебе символы) в строку not_possible?   smile
 
Цитата(akizelokro @  10.8.2007,  13:30 Найти цитируемый пост)
А потом, возвращаясь к первоначальной задаче, нужно будет длишу строки отслеживать,

По-моему, в первоначальной задаче о длине строки ничего  не говорилось.  smile 

Цитата(akizelokro @  10.8.2007,  13:30 Найти цитируемый пост)
кстати, str="Новая папка\0";оно вообще дастся к созданию?

А почему нет?  smile 



--------------------
Тут вечности запах томительный,
И свежие фрукты дешевые, 
А климат у нас – изумительный, 
И только соседи – #уевые. 
                           Игорь Губерман.
PM   Вверх
akizelokro
Дата 10.8.2007, 14:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Крокодил
**


Профиль
Группа: Участник
Сообщений: 761
Регистрация: 30.7.2007

Репутация: 1
Всего: 5



Цитата

Цитата(Dov @ 10.8.2007,  13:56)

akizelokro, а что мешает добавить символ новой строки '\n' (равно, как и другие, не нужные тебе символы) в строку not_possible?   smile


Да нет, предыдущий вариант лучше по причинам уверенного кода. Лучше проверять на наличие только разрешенных символов, потому что непонятно, какие символы могут быть неразрешены) (локализация типа. кто знает, какие по-албански к примеру символы печатные, а какие х,у,z...)
 
Цитата

По-моему, в первоначальной задаче о длине строки ничего  не говорилось.  smile 


Создание каталога по подходящей строке? smile - ограничение файлсистемы на длину имени, но это мелочи

Цитата(akizelokro @  10.8.2007,  13:30 Найти цитируемый пост)
кстати, str="Новая папка\0";оно вообще дастся к созданию?

А почему нет?  smile

 
Грешным делом закрыжил такую поделку

string s="00000\01\0";
Application->MessageBox("Up",s.c_str());

Воспринимает \01 вместе, а не по раздельности. А жаль!




--------------------
a = a + b; b = a - b; a = a - b;
PM MAIL   Вверх
Xenon
Дата 10.8.2007, 15:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1529
Регистрация: 12.4.2006

Репутация: 11
Всего: 50



Dov, тогда уж так smile
Код

int main() 
{
    string not_possible = "qwertyuiopasdfghjklzxcvbnm,./`=~!@#$%^&*{}[]()<>+|;:\"?'";
    string str          = "_QWERTY-2";
    cout << (str.find_first_of(not_possible) != string::npos ? "ERROR!!!" : str) << endl;
    return 0;    
}

переносимей.

Это сообщение отредактировал(а) Xenon - 10.8.2007, 15:30


--------------------
user posted image  
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0526 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.