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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> удаление предпоследнего слова 
:(
    Опции темы
blackofe
Дата 6.12.2005, 00:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(nikitao @ 5.12.2005, 23:44)
Не все равно работать не будет даже в стандартной кодировке(к прмеру моей в WINXP).И дело не в ё и Ё .Я топик создавал про RString,там та же проблемма.симвлы от 'А' до 'п' отделены от 'р' до 'я' кучей барохла.Короче правельность этой проги(без серьезной дороботки) можно гарантировать только в Dose,что в сегоднишние дни бесмыссленно.А в Winde сложно увидеть ее в действии т е сложно сказать правельно ли она написана "даже с учетом упрощения ситуации" .

в том то и дело, что дырка между "п" и "р" существует в определенной кодировке (в частности в 866), а, допустим, в кодировке 1251 дырки нет, но буквы 'ё' и 'Ё' выведены отдельно и не вписываются в формулу 'а' <= ch && ch <= 'я'. и поэтому и существует библиотечная функция isalpha, чтобы учитывать все эти особенности кодировок.

вот пример:

Код
#include <locale>
#include <iostream>
using namespace std;

int main()
{
    unsigned int chs[] = { 0xb8, 0xff, 0x9b };
    cout << "hex, char, 1251, 866" << endl;
    for(int i = 0; i < sizeof(chs)/sizeof(chs[0]); ++i)
        cout << hex << chs[i] << '\t' << (char)chs[i] << ", " << boolalpha
                << isalpha((char)chs[i], locale("russian_Russia.1251")) << ", "
                << isalpha((char)chs[i], locale("russian_Russia.866")) << endl;
    return 0;
}


этот код рисует такую картину (символы показаны в виндовой кодировке):

Код
hex, char, 1251, 866
b8    ё, true, false
ff    я, true, false
9b    >, false, true


символ с кодом 0xb8, которым в виндовой кодировке представлена буква 'ё', в досовской кодировке представляет собой рамочный уголок. isalpha() разрулила эту ситуацию правильно. то же самое в отношении остальных символов.

Это сообщение отредактировал(а) blackofe - 6.12.2005, 01:06
PM MAIL   Вверх
Fixin
Дата 6.12.2005, 12:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ёжик
***


Профиль
Группа: Комодератор
Сообщений: 1357
Регистрация: 6.1.2004

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



Ну вы, народ, даете smile Скоро в религиозный войны уедете.
У автора топика задание на алгоритмизацию, а не на знание языка, посему предполагается простейшее решение без вызовов доп ф-ций и библиотека. А про указатели он сам говорил, что не знает. Да и, кажется, автор и сам больше не приходил. (а так, темка интересная получилась)
PM MAIL ICQ   Вверх
blackofe
Дата 6.12.2005, 19:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(Fixin @ 6.12.2005, 12:16)
Ну вы, народ, даете smile Скоро в религиозный войны уедете.
У автора топика задание на алгоритмизацию, а не на знание языка, посему предполагается простейшее решение без вызовов доп ф-ций и библиотека. А про указатели он сам говорил, что не знает. Да и, кажется, автор и сам больше не приходил. (а так, темка интересная получилась)

использовать библиотечные функции незазорно. даже printf().

а если не хочется использовать библиотечную isalpha(), то тогда надо написать свою, но корректно. пример реализации, приведенный sergej.z:

Код
bool isAlpha(char c)
{
 return c>='a'&&c<='z' || c>='A'&&c<='Z' || c>='а'&&c<='я'&&c>='А'&&c<='Я';
}


неверный. о чем, собственно, и речь.

/я уж не говорю о том, что эта функция вообще написана неправильно. но даже если ее и подрехтовать в соответствии с задумкой автора типа

Код
bool isAlpha(char c)
{
 return ('a' <= c && c <= 'z') || ('A' <= c && c <= 'Z') || ('а' <= c && c <= 'я') || ('А' <= c && c <= 'Я');
}


то все-равно она будет работать неверно./

Это сообщение отредактировал(а) blackofe - 6.12.2005, 19:06
PM MAIL   Вверх
sergejzr
Дата 7.12.2005, 03:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

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



Да нет, проблема в том, что char никогда не станет русским символом ни в одной совместимой с ASCII кодировкой(Я к сож. очень привык к яваскрипту и PHP). Так что функция правильно определяет букву только для латиницы.
Я ведь не говорю. что isalpha() использовать ненадо. Просто задумка не искать конкретные разделители, а считать все "небуквы" разделителями. для большего функция isAlpha не задумывалась. Только как макет.

Верный - неверный smile Алгоритм в теории показан - отбирать только буквы. Кто виноват, что в конкретных кодировках намудрили с кириллицей? Это уже техническая часть, не алгоритмическая.

Если тебя это устроит, isalpha корректнее конечно. smile

Цитата(blackofe @ 6.12.2005, 18:01)
/я уж не говорю о том, что эта функция вообще написана неправильно. но даже если ее и подрехтовать в соответствии с задумкой автора типа..

Чем твоя правильнее? Просвети.




--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
blackofe
Дата 7.12.2005, 18:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(sergej @ 7.12.2005, 03:07)
Чем твоя правильнее? Просвети.

просвещаю. ошибка в предпоследней операции &&.

Код
bool isAlpha(char c)
{
 return c>='a'&&c<='z' || c>='A'&&c<='Z' || c>='а'&&c<='я'&&c>='А'&&c<='Я';
}


вместо нее надо писать ||.

Код
bool isAlpha(char c)
{
 return c>='a'&&c<='z' || c>='A'&&c<='Z' || c>='а'&&c<='я' || c>='А'&&c<='Я';
}


иначе, ни одна русская буква (если предположить, что русская кодировка подразумевает расположение всех букв алфавита строго друг за дружкой) не будет поймана этой функцией - ни одна русская буква не может находиться среди маленьких И среди больших букв одновременно.
PM MAIL   Вверх
sexton
Дата 7.12.2005, 18:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sexton=Пономарь (eng)
**


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

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



Довольно известная штуковина - кусок кода из MSDN для определения слов в строке
Код

char string[] = "A string\tof ,,tokens\nand some  more tokens";
char seps[]   = " ,\t\n";
char *token;

void main( void )
{
   printf( "Sourse: %s\n\nTokens:\n", string );
   /* Establish string and get the first token: */
   token = strtok( string, seps );
   while( token != NULL )
   {
      /* While there are tokens in "string" */
      printf( " %s\n", token );
      /* Get next token: */
      token = strtok( NULL, seps );
   }
}

Можно это присобачить smile
PM MAIL WWW ICQ   Вверх
sergejzr
Дата 7.12.2005, 18:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

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



Да, тьфу блин! это опечатка была.


--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
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.0574 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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