Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Как правильно посчитать слова


Автор: Rutti 8.5.2008, 21:22
считаю количество слов в тексте используя ispunct, isspace и isdigit. Но всё время получаю неправильный результат из-за того что неправильно выставляю условие цикла:
Код

if(icpuct(c) && isspace(c) && isdigit(c))
.
Как правильно выставить условие что бы в тексте отсечь все знаки пунктации, пробелы и цифры и получить одни только слова?

Автор: Rififi 8.5.2008, 21:30
правильно - разбивать на токены (strtok)

Автор: Ln78 9.5.2008, 14:29
Цитата(Rutti @  8.5.2008,  21:22 Найти цитируемый пост)


if(icpuct© && isspace© && isdigit©)


Rutti, использование вместо И (&&) операции ИЛИ (||) несколько приблизит к цели  smile 

Автор: Rutti 10.5.2008, 06:55
Ln78
Цитата(Ln78 @  9.5.2008,  14:29 Найти цитируемый пост)
использование вместо И (&&) операции ИЛИ (||) несколько приблизит к цели

Не приблизило.

А strtok не совсем то что нужно.

Автор: Ln78 10.5.2008, 07:54
Rutti, так больше кода приведено не было smile 
А та строчка с условием - явно неправильная. Требовать, чтобы символ одновременно был и пробелом, и цифрой, и ещё чем-то - я таких чудо-символов не знаю 

Автор: bronislav 10.5.2008, 09:56
Цитата(Rutti @  8.5.2008,  21:22 Найти цитируемый пост)

Код

if(icpuct(c) && isspace(c) && isdigit(c))
    


Мне кажется условия должно быть такое
Код

if(!icpuct(c) && !isspace(c) && !isdigit(c))
    

Автор: Droll 11.5.2008, 17:11
А почему это strtok не совсем то, что нужно? По-моему, с его помощью замечательно считается количество слов в строке.

Автор: Rutti 18.5.2008, 08:46
Droll, потому что условие надо задавать жёстко. Т.е. нет универсальности

Автор: almagnit 18.5.2008, 09:00
Rutti, я когда-то выполнял подобный алгоритм для выполнения задачи поиска введенного слова.

Не мучайся со стандартными функциями, создай свою и помести перечень всех нужных знаков (их не так много)

и проверяй на существование знака, если такой есть значит увеличивай счетчик т.к. слово закончилось.

ЗЫ:
ИМХО нужно думать своей головой, кто-то на форуме сказал, что изобретая велосипеды мы становимся проффесионалами  smile 

Автор: Rutti 6.6.2008, 13:05
Цитата(almagnit @  18.5.2008,  09:00 Найти цитируемый пост)
Не мучайся со стандартными функциями

А что с ними? Почему они, по сути, неправильно работают? Может всё-таки разобраться с причинами на будущее?

Автор: JackYF 6.6.2008, 13:29
Цитата(almagnit @  18.5.2008,  08:00 Найти цитируемый пост)
кто-то на форуме сказал, что изобретая велосипеды мы становимся проффесионалами

Верно. Только после изобретения часто нужно велосипед поместить на полочку и разобраться со стандартными функциями, написанными до тебя. По ним хоть документация есть.

Автор: rrrFer 6.6.2008, 14:38
а например
for(i=0;!feof(f);fscanf(f,"%s",&s))
    i++;
не пойдет?

Автор: Rutti 8.6.2008, 09:31
Цитата(rrrFer @  6.6.2008,  14:38 Найти цитируемый пост)
а напримерfor(i=0;!feof(f);fscanf(f,"%s",&s))    i++;не пойдет?

Думаю, нет.

Всё же хотелось бы разобраться с работой isspace() и ей подобными.

Автор: rrrFer 8.6.2008, 13:21
Rutti
Цитата(Rutti @  8.6.2008,  09:31 Найти цитируемый пост)
Всё же хотелось бы разобраться с работой isspace() и ей подобными.

разобраться конечно не плохо...однако, зачем использовать функции, без которых программа будет работать и работать быстрее.
А что с ними разбираться впринципе smile - открываешь справочник и смотришь какие параметры принимает и что возвращает, а если хочешь разобраться как они работают...я думаю, что в каждой из функций: isspace,ispunct,isgraph,isdigit,isuper и т.д. есть массив АСКИ-кодов символов, с которым сравнивается переданный как параметр символ...(просто предположение)

Автор: just_geek 10.6.2008, 10:14
rrrFer
ничего подобного

isdigit выглядит примерно так
Код

int isdigit(int c)
{
if (c>='0' && c<='9')
    return 1;
return 0;
}


естественно она будет не корректно работать с разными языками smile

Автор: Rutti 10.6.2008, 11:48
just_geek, ну вот это уже здорово и продуктивно. И как сделать работу этих всех is универсальнее? Кстати, текст-то я обрабатывал на английском

Автор: JackYF 10.6.2008, 15:09
Цитата(just_geek @  10.6.2008,  09:14 Найти цитируемый пост)
естественно она будет не корректно работать с разными языками

Цитата(just_geek @  10.6.2008,  09:14 Найти цитируемый пост)
isdigit выглядит примерно так

Откуда информация и почему у меня в мане написано, что функция проверяет наличие символа определённому классу, в зависимости от локали?

Автор: Rififi 10.6.2008, 15:36
JackYF
потому что ты читаешь про std::isdigit()

Автор: Lazin 10.6.2008, 15:39
можно для этих целей использовать boost::tokenizer

Автор: JackYF 10.6.2008, 15:48
Цитата(Rififi @  10.6.2008,  14:36 Найти цитируемый пост)
потому что ты читаешь про std::isdigit() 

Код

ISALPHA(3)                                                      Linux Programmer’s Manual                                                      ISALPHA(3)

NAME
       isalnum,  isalpha,  isascii,  isblank, iscntrl, isdigit, isgraph, islower, isprint, ispunct, isspace, isupper, isxdigit - character classification
       routines

SYNOPSIS
       #include <ctype.h>

       int isalnum(int c);
       int isalpha(int c);
       int isascii(int c);
       int isblank(int c);
       int iscntrl(int c);
       int isdigit(int c);
       int isgraph(int c);
       int islower(int c);
       int isprint(int c);
       int ispunct(int c);
       int isspace(int c);
       int isupper(int c);
       int isxdigit(int c);

Я вижу самый обычный сишный isdigit, а ты? smile

Автор: 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,  16:12 Найти цитируемый пост)
_isdigit_l

что-то я такой функции не знаю, она в каком стандарте описана?

Автор: Rififi 10.6.2008, 19:50
Цитата(JackYF @  10.6.2008,  19:14 Найти цитируемый пост)
что-то я такой функции не знаю, она в каком стандарте описана? 

а нет её там. это изобретение MS

Автор: JackYF 10.6.2008, 23:51
Цитата(Rififi @  10.6.2008,  18:50 Найти цитируемый пост)
а нет её там. это изобретение MS 

А раздел называется "С++: Общие Вопросы" ;)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)