Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.04.2011, 21:27   #1
Byurrer
Пользователь
 
Регистрация: 15.01.2011
Сообщений: 77
По умолчанию Возможные варианты написания отдельных слов

Здравтсвуйте. Нужно найти слово в тексте, причем слово должно отдельно стоять, ну тоесть не должно слитно написано в с другими словами, составил функцию которая ищет слово в тексте и если это действительно слово тогда возвращает его позицию в тексте:
Код:
int searchLs(AnsiString text, AnsiString word) 
{//log("text = "+text);log("word = "+word);
int pos = text.AnsiPos(" "+word+" ");
    if(pos == NULL)
    {pos = text.AnsiPos("\n"+word+" ");
        if(pos == NULL)
        {pos = text.AnsiPos(" "+word+"\n");
            if(pos == NULL)
            {pos = text.AnsiPos("\n"+word+"\n");
                if(pos == NULL)
                {pos = text.AnsiPos("\t"+word+"\n");
                    if(pos == NULL)
                    {pos = text.AnsiPos("\n"+word+"\t");
                        if(pos == NULL)
                        {pos = text.AnsiPos("\t"+word+"\t");
                            if(pos == NULL)
                            {pos = text.AnsiPos("\t"+word+" ");
                                if(pos == NULL)
                                {pos = text.AnsiPos(" "+word+"\t");
                                    if(pos == NULL){pos = -1;}
                                }
                            }
                        }
                    }
                }
            }
        }
    }
return pos;
}
Вроде бы все варианты, но если строка начинается с символа табуляции, оканчивается переносом строки, и в этой строке содержится искомое слово без пробелов, то тогда функция не может ее найти ... подскажите пожалуйста как можно решить эту проблему? Заранее спасибо!
Byurrer вне форума Ответить с цитированием
Старый 10.04.2011, 22:25   #2
Tema_Crazzzy
Форумчанин
 
Регистрация: 29.04.2010
Сообщений: 114
По умолчанию

Знаете, ваш алгоритм не оптимален, имхо!!!
Я бы делал так:
1) Создал массив типа char в котором бы содержались: "_", \t, \n, b т.д.
2) Нашел бы позицию слова в тексте: pos=text.AnsiPos(word);
3) И проверил бы совпадение границ слова [pos-1;pos+word.length()+1] на совпадение с символами из массива. При нужных условиях возвращаем позицию.
4) И так в цикле

Писал спонтанно. Можно придумать что-нибудь и получше чем я тут накалякал, но не куча ifов!

Последний раз редактировалось Tema_Crazzzy; 10.04.2011 в 22:28.
Tema_Crazzzy вне форума Ответить с цитированием
Старый 10.04.2011, 22:36   #3
Byurrer
Пользователь
 
Регистрация: 15.01.2011
Сообщений: 77
По умолчанию

Tema_Crazzzy не спорю, мне самому не очень нравится, в луа обошелся несколькими строчками кода, но здесь я пока мало что знаю ... да и к тому же мне просто нужно узнать какой вариант я пропустил ... или может существуют еще какие-нибудь подобные символы?
Byurrer вне форума Ответить с цитированием
Старый 10.04.2011, 23:46   #4
Blade
Software Engineer
Участник клуба
 
Аватар для Blade
 
Регистрация: 07.04.2007
Сообщений: 1,618
По умолчанию

isspace()
Что с ней делать можно догадаться ))
Мужество есть лишь у тех, кто ощутил сердцем страх, кто смотрит в пропасть, но смотрит с гордостью в глазах. (с) Ария
Blade вне форума Ответить с цитированием
Старый 13.04.2011, 18:48   #5
Byurrer
Пользователь
 
Регистрация: 15.01.2011
Сообщений: 77
По умолчанию

Blade почитал в интернете про эту функцию ... это по сути то что мне нужно, но так и не смог ее использовать ... дело в том что я использую тип AnsiString, а нужно char ... Подскажите пожалуйста как можно преобразовать? Заранее спасибо!
P.S text.c_str() не помогает ...
Byurrer вне форума Ответить с цитированием
Старый 13.04.2011, 18:56   #6
Hacker19_90
Delphi Warrior
Старожил
 
Аватар для Hacker19_90
 
Регистрация: 15.08.2008
Сообщений: 2,502
По умолчанию

Цитата:
Подскажите пожалуйста как можно преобразовать?
Метод с_str() вернёт указатель на массив char
Примерно так
Код:
char* convert(AnsiString word)
{
     return word.c_str();
}
Mess with the best, die like the rest. (с) Hackers
Лабораторные, курсовые на Delphi\Pascal\C++
ya.flex-freelance@yandex.ru Icq - 636-954-303
Hacker19_90 вне форума Ответить с цитированием
Старый 13.04.2011, 19:12   #7
Byurrer
Пользователь
 
Регистрация: 15.01.2011
Сообщений: 77
По умолчанию

Hacker19_90 спасибо, попробую и так сделать, после того как написал собщение додумался как можно ... вот как сделал:
Код:
char convert(char*p)
{char ch;
    if (*p){ch = *p;}
return ch;
}
Byurrer вне форума Ответить с цитированием
Старый 14.04.2011, 07:16   #8
Byurrer
Пользователь
 
Регистрация: 15.01.2011
Сообщений: 77
По умолчанию

Возникла проблема, вот текст: log( string.format(fmt,...))
Подобных строк много, но выделенной место между двумя буквами не распознается как пробел (проверяю isspace()) ... Возможны ли какие-то другие символы типа пробела
Byurrer вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
просчитать все возможные варианты диапазона используя VBA PARTOS Microsoft Office Excel 16 11.10.2010 10:57
Все возможные варианты строки Vikenty Общие вопросы Delphi 3 29.08.2010 03:30
Можно ли программно предопределять стиль отдельных слов в строковом выражении? G_George Microsoft Office Word 3 06.12.2009 15:47
по вводу слов в массив и подсчёт введённых слов -ushёl- Общие вопросы C/C++ 4 16.11.2009 00:45
Составить в алфавитном порядке список всех слов, встречающихся в тексте, и количество этих слов. KAPAHDAW Паскаль, Turbo Pascal, PascalABC.NET 2 17.02.2009 01:19