The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]




Версия для распечатки Пред. тема | След. тема
Новые ответы [ Отслеживать ]
Чем заменили strlwr?, !*! zkrvova, 23-Июн-08, 14:08  [смотреть все]
Вот в линуксе не нашёл функцию strlwr, а чем её заменили? Или похожей функции совсем нету?
  • Чем заменили strlwr?, !*! phpcoder, 14:11 , 23-Июн-08 (1)
    >Вот в линуксе не нашёл функцию strlwr, а чем её заменили? Или
    >похожей функции совсем нету?

    Что делает эта ваша ф-ция? В гуле уже искали по словам "strlwr linux" ?

    • Чем заменили strlwr?, !*! zkrvova, 14:21 , 23-Июн-08 (2)
      >>Вот в линуксе не нашёл функцию strlwr, а чем её заменили? Или
      >>похожей функции совсем нету?
      >
      >Что делает эта ваша ф-ция? В гуле уже искали по словам "strlwr
      >linux" ?

      Она переводит все семволы строки в нижний регистр. В гугле искал. Это сишная функция.

      • Чем заменили strlwr?, !*! phpcoder, 14:28 , 23-Июн-08 (3)
        >Она переводит все семволы строки в нижний регистр.

        Стандартной нет. Придётся написать свою, благо это очень легко:

        for (int i = 0; i < strlen(string); ++i) {
            string[i] = tolower(string[i]);
        }

        Если на С++, то можно transform()'ом пройтись или использовать to_lower() из буста.

        • Чем заменили strlwr?, !*! arturpub, 08:16 , 24-Июн-08 (4)
          ну или так если очень уж длинная...
          for (char *p = str; *p; p++) *p = tolower(*p);

          кстати всем вопрос на засыпку: сколько раз вычисляется условие цикла ?

          • ?, !*! Andrey Mitrofanov, 09:40 , 24-Июн-08 (5)
            >for (char *p = str; *p; p++) *p = tolower(*p);
            >кстати всем вопрос на засыпку: сколько раз вычисляется условие цикла ?

            strlen(str)+1

            В чём "засыпка"-то??

          • Чем заменили strlwr?, !*! vic, 12:37 , 24-Июн-08 (8)
            >ну или так если очень уж длинная...
            >for (char *p = str; *p; p++) *p = tolower(*p);
            >
            >кстати всем вопрос на засыпку: сколько раз вычисляется условие цикла ?

            Код был приведен для примера, ясень пень юзать strlen() в условии не гуд.
            А ваще:
            for (char *p = str; p && *p; ++p) *p = tolower(*p); // и то, только в c99 или С++, иначе char *p объявляется до цикла.
            и т.д.

            Смысл примера был в другом.

            А если уж хочется вопросов на засыпку, то:
            1. смотрим man tolower(), на предмет возвращаемого значения =)
            2. думаем что случится если кодировка в строке будет несколько не та.. не соответствовать локали так сказать..
            3. ну и наконец utf-8, для которой это не работает ни разу. А если еще осознать что в utf-8 один и тот же символ в нижнем и верхнем регистре может быть представлен разным количеством байтов...
            4. а еще бывает wide char... и юникод =)

            http://www-306.ibm.com/software/globalization/icu/index.jsp

            • Чем заменили strlwr?, !*! arturpub, 14:53 , 24-Июн-08 (10)
              повторяющееся определение strlwr есть в гугле. кстати сказать функции из string.h никогда не проверяли аргументы на NULL, на соответствие кодировки/локали и есть тама utf-8 или нет; определить это - задача программиста. для wchar_t будет соотв. wcslwr.
              tolower вернул int, что и должен был. (??)
              • Чем заменили strlwr?, !*! vic, 16:54 , 24-Июн-08 (11)
                >повторяющееся определение strlwr есть в гугле.

                гугл это еще не posix.

                >кстати сказать функции из string.h никогда
                >не проверяли аргументы на NULL, на соответствие кодировки/локали и есть тама
                >utf-8 или нет; определить это - задача программиста. для wchar_t будет
                >соотв. wcslwr.

                Я продемонстрировал ненужность указания недочетов в примере, это всего лишь пример. На вашем же примере показав как минимум три недочета в коде. Проверять или не проверять на null в вашем примере тоже самое что писать в условии цикла strlen(), т.к. и то, и то плохой стиль. Задача программиста писать переносимый код, а не код который завтра же придется править только потому что у клиента другая кодировка. В случае введения поддержки utf-8 такой код править - полный абзац (по опыту), особенно для интернационального приложения.

                >tolower вернул int, что и должен был. (??)

                Да, именно так, и принимает int, а данные char. Функция небезопасная. Хотя в данном примере порча строки при некорректной локали это максимум что может произойти. Но все же были случаи когда это порождало серьезные баги.

                • Чем заменили strlwr?, !*! arturpub, 20:06 , 24-Июн-08 (12)
                  простите, признаюсь что тупо напал на strlen.
                  вы меня не совсем поняли. я говорю о том, как на самом деле определена функция, пусть не posix'ом, то хотя бы большим количеством описаний в сети. прочитайте его еще раз. написана она в соотв. с теми требованиями, которые были к ней до этого, своего ничо не добавлял ;) т.о. задачу по реализации считаю выполненной правильно.

                  если у клиента другая кодировка, то (раз уж мы работаем с содержимым строк как с символами, а не как с байтами туда-обратно) при "не той" кодировке "перестанет" работать и весь clib, так ? для выбора другой локали есть setlocale(), utf-8 же clib'ом поддерживается только через mbs->wcs, и функции работы с wcs имеют одноименный префикс. где уж это мой недочет ? если программист _действительно_ планирует работу с толстыми буквами, то ему нужно подумать об этом заранее, а не ругать имеющиеся средства. то есть конвертим utf8 в wcs и применяем wcslwr/towlower. с ucs4 конечно на clib'е тяжелее.

                  насчет локали. если setlocale() вызвана с верным аргументом, то для любой 8-битной кодировки tolower() вернет правильное значение, даже для utf8 (т.к. utf8 в плане однобайтных символов идентична 7-bit ascii, и ни одна русская буква не попортится). и разумеется *str*lwr не обратит неаскёвую часть.

                  избитый нами int tolower(int) принимает в нашем контексте всегда не более чем char; в мануале сказано, что если "c is not an unsigned char value, or EOF, the behaviour of these functions is undefined.", иначе оно возвращает int, который без потерь кастится в char. тут опять не вижу проблем в применении.

                  • Чем заменили strlwr?, !*! vic, 14:57 , 26-Июн-08 (13)
                    >простите, признаюсь что тупо напал на strlen.
                    >вы меня не совсем поняли. я говорю о том, как на самом
                    >деле определена функция, пусть не posix'ом, то хотя бы большим количеством
                    >описаний в сети. прочитайте его еще раз. написана она в соотв.
                    >с теми требованиями, которые были к ней до этого, своего ничо
                    >не добавлял ;) т.о. задачу по реализации считаю выполненной правильно.

                    ОК
                    >
                    >если у клиента другая кодировка, то (раз уж мы работаем с содержимым строк как с символами, а не как с байтами туда-обратно) при "не той" кодировке "перестанет" работать и весь clib, так ?

                    нет перстанет работать контекст-зависимая часть функций, т.к. строка (char*) остается нуль-терминированной (до тех пор пока туда не начнут пихать совсем черт знает что), т.е. всякие strcmp, strcpy, работать будут.

                    > для выбора другой локали есть setlocale(), utf-8 же clib'ом поддерживается только через mbs->wcs, и функции работы с wcs имеют одноименный префикс. где уж это мой недочет ? если программист _действительно_ планирует работу с толстыми буквами, то ему нужно подумать об этом заранее, а не ругать имеющиеся средства. то есть конвертим utf8 в wcs и применяем wcslwr/towlower. с ucs4 конечно на clib'е тяжелее.

                    Верно, и думать надо т.к. сейчас основной кодировкой становится utf-8, а с strlwr-ориентированными решениями будет беда.

                    >
                    >насчет локали. если setlocale() вызвана с верным аргументом, то для любой 8-битной
                    >кодировки tolower() вернет правильное значение, даже для utf8 (т.к. utf8 в
                    >плане однобайтных символов идентична 7-bit ascii, и ни одна русская буква
                    >не попортится). и разумеется *str*lwr не обратит неаскёвую часть.

                    Вот-вот для utf-8 функция например вообще не работает, преобразование будет не выполнено. А это явно не то что хотелось бы.

                    >
                    >избитый нами int tolower(int) принимает в нашем контексте всегда не более чем
                    >char; в мануале сказано, что если "c is not an unsigned
                    >char value, or EOF, the behaviour of these functions is undefined.",
                    >иначе оно возвращает int, который без потерь кастится в char. тут
                    >опять не вижу проблем в применении.

                    в данном конкретном случае да.


                    • Чем заменили strlwr?, !*! arturpub, 04:30 , 27-Июн-08 (14)
                      >Вот-вот для utf-8 функция например вообще не работает, преобразование будет не выполнено.
                      >А это явно не то что хотелось бы.

                      мы явно погнули разные линии 8)
                      иногда ведь это именно то, что хотелось бы, вот тогда мы и называем это желание "strlwr". вспомните хотя бы сканеры языков, сетевых протоколов, и т.д., где перемешаны 2 локали: C и какая-то еще -- они их разделяют. не то что бы в этих случаях не подходила реализация, которая поддерживает еще и утф, нет... просто там этого не надо.

        • Чем заменили strlwr?, !*! zkrvova, 10:54 , 24-Июн-08 (7)
          >>Она переводит все семволы строки в нижний регистр.
          >
          >Стандартной нет. Придётся написать свою, благо это очень легко:
          >
          >for (int i = 0; i < strlen(string); ++i) {
          >    string[i] = tolower(string[i]);
          >}
          >
          >Если на С++, то можно transform()'ом пройтись или использовать to_lower() из буста.
          >

          Спасибо!




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2025 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру