| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Общие вопросы > Как правильно посчитать слова |
| Автор: Rutti 8.5.2008, 21:22 | ||
считаю количество слов в тексте используя ispunct, isspace и isdigit. Но всё время получаю неправильный результат из-за того что неправильно выставляю условие цикла:
Как правильно выставить условие что бы в тексте отсечь все знаки пунктации, пробелы и цифры и получить одни только слова? |
| Автор: Rififi 8.5.2008, 21:30 |
| правильно - разбивать на токены (strtok) |
| Автор: Ln78 9.5.2008, 14:29 |
Rutti, использование вместо И (&&) операции ИЛИ (||) несколько приблизит к цели |
| Автор: Rutti 10.5.2008, 06:55 | ||
Ln78,
Не приблизило. А strtok не совсем то что нужно. |
| Автор: Ln78 10.5.2008, 07:54 |
| Rutti, так больше кода приведено не было А та строчка с условием - явно неправильная. Требовать, чтобы символ одновременно был и пробелом, и цифрой, и ещё чем-то - я таких чудо-символов не знаю |
| Автор: bronislav 10.5.2008, 09:56 | ||
Мне кажется условия должно быть такое
|
| Автор: Droll 11.5.2008, 17:11 |
| А почему это strtok не совсем то, что нужно? По-моему, с его помощью замечательно считается количество слов в строке. |
| Автор: Rutti 18.5.2008, 08:46 |
| Droll, потому что условие надо задавать жёстко. Т.е. нет универсальности |
| Автор: almagnit 18.5.2008, 09:00 |
| Rutti, я когда-то выполнял подобный алгоритм для выполнения задачи поиска введенного слова. Не мучайся со стандартными функциями, создай свою и помести перечень всех нужных знаков (их не так много) и проверяй на существование знака, если такой есть значит увеличивай счетчик т.к. слово закончилось. ЗЫ: ИМХО нужно думать своей головой, кто-то на форуме сказал, что изобретая велосипеды мы становимся проффесионалами |
| Автор: Rutti 6.6.2008, 13:05 |
А что с ними? Почему они, по сути, неправильно работают? Может всё-таки разобраться с причинами на будущее? |
| Автор: rrrFer 6.6.2008, 14:38 |
| а например for(i=0;!feof(f);fscanf(f,"%s",&s)) i++; не пойдет? |
| Автор: Rutti 8.6.2008, 09:31 |
Думаю, нет. Всё же хотелось бы разобраться с работой isspace() и ей подобными. |
| Автор: rrrFer 8.6.2008, 13:21 |
| Rutti, разобраться конечно не плохо...однако, зачем использовать функции, без которых программа будет работать и работать быстрее. А что с ними разбираться впринципе |
| Автор: just_geek 10.6.2008, 10:14 | ||
| rrrFer, ничего подобного isdigit выглядит примерно так
естественно она будет не корректно работать с разными языками |
| Автор: Rutti 10.6.2008, 11:48 |
| just_geek, ну вот это уже здорово и продуктивно. И как сделать работу этих всех is универсальнее? Кстати, текст-то я обрабатывал на английском |
| Автор: JackYF 10.6.2008, 15:09 |
Откуда информация и почему у меня в мане написано, что функция проверяет наличие символа определённому классу, в зависимости от локали? |
| Автор: Rififi 10.6.2008, 15:36 |
| JackYF, потому что ты читаешь про std::isdigit() |
| Автор: Lazin 10.6.2008, 15:39 |
| можно для этих целей использовать boost::tokenizer |
| Автор: JackYF 10.6.2008, 15:48 | ||
Я вижу самый обычный сишный isdigit, а ты? |
| Автор: Rififi 10.6.2008, 17:12 |
| Я вижу самый обычный сишный isdigit я кажется понял, о чём ты. обычный сишный isdigit при сравнении использует установленную текущую локаль. [msdn]The result of the test condition for the isdigit function depends on the LC_CTYPE category setting of the current locale; see setlocale for more information[/msdn] я имел в виду, что если нужно сравнивать с другой локалью - то используется _isdigit_l [msdn]The versions of these functions with the _l suffix are identical except that they use the locale passed in instead of the current locale for their locale-dependent behavior.[/msdn] или std::isdigit |
| Автор: JackYF 10.6.2008, 19:14 |
что-то я такой функции не знаю, она в каком стандарте описана? |
| Автор: Rififi 10.6.2008, 19:50 |
а нет её там. это изобретение MS |
| Автор: JackYF 10.6.2008, 23:51 |
А раздел называется "С++: Общие Вопросы" ;) |