На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Правила раздела Visual C++ / MFC / WTL (далее Раздела)
1) На Раздел распространяются все Правила Форума.
2) Перед тем, как создать новый топик, убедитесь, что Вы читали Правила создания тем в Разделе.
3) Вопросы, не связанные с программированием (настройки MS Visual Studio, книги, библиотеки и т.д.),
обсуждаются в разделе C/C++: Прочее
4) Вопросы разработки .NET (Windows Form, C++/CLI и т.п.) приложений на Visual C++/C# обсуждаются в разделе .NET.
5) Нарушение Правил может повлечь наказание со стороны модераторов.

Полезные ссылки:
user posted image FAQ Раздела user posted image Обновления для FAQ Раздела user posted image Поиск по Разделу user posted image MSDN Library Online
Модераторы: ElcnU
Страницы: (3) 1 [2] 3  все  ( Перейти к последнему сообщению )  
> char и unsigned char
    Цитата Andy_KZ, 05.08.03, 11:40:12
    char - используется для строковых переменных (нуль-терминированных), размер буфера определяется, например, strlen-ом.

    :o :o :o!
    Ну это совсем круто... :-/
    Хочешь сказать, это сработает? :D
    ExpandedWrap disabled
      <br>char ch;<br>int len = strlen(ch);<br>

    ;) ;D :P.
      хех, я имел ввиду массивы данных...
      это можно было понять из контекста, хотябы по методу strlen. Который, как известно, возвращает длину переданной ему строки...
        ОК :-).
        Кстати, unsigned char* тоже может оканчиваться нулем. Всегда же мона преобразовать uchar* в char*, а там его в strlen() запихнуть \%).
          Цитата byte, 05.08.03, 11:54:47
          ОК :-).
          Кстати, unsigned char* тоже может оканчиваться нулем. Всегда же мона преобразовать uchar* в char*, а там его в strlen() запихнуть \%).


          а что ты будешь делать, если внутри uchar* несколько НУЛЛ-ов окажется в разных местах, или других кракозяб?
          правильнее, ИМХО, предполагать, что uchar* не может быть приведен к char*...
            Дык а как ты себе такое представляешь? :) Сколько NULL-ов ты туды запихаешь, стока их и будет \%). При преобразовании не могут же возникнуть дополнительные NULL-chars... А другие "кракозябы" на strlen() не влияют \%).
              Andy_KZ, открою тебе маленький секрет. char*, uchar*, schar* - это просто указатели на области памяти, содержащие элементы соответствующего типа (char, uchar, schar). Это могут быть строки (null-termnated), а могут быть просто вектора однобайтовых числел. Возьмем, например, класс string. В ряде реализаций (например, в GNU) он, грубо говоря, имеет следующий вид:
              ExpandedWrap disabled
                <br>... class basic_string ...<br>{<br>//...<br>private:<br>char* data;<br>int len;<br>//...<br>};<br>

              При этом, сама хранимая строка нулем не заканчивается.
              Я к тому, что char может быть использован для null-terminated строк. В частности, строковые литералы имеют тип const char*, но это не значит, что используется только для них.
                ок
                я имел ввиду следующее:
                1. когда работаешь с текстовы файлом, например, удобно его загнать весь в буфер типа char* и делать там с ним что захочется :) Например - файл конфигурации для какойнить проги...
                2. когда работаешь с бинарным файлом, например, его лучше загонять в буфер unsigned char*. Например, сертификат клиента. И вот чтобы на бумажке распечатать , например, серийный номер этого сертификата, его необходимо привести к читабельному виду (A306FFF2120001 и так далее...). И в таком буфере этих нулей может бфть сколько угодно :). Простым преобразованием из unsigned char* к типу char* это не сделаешь... Вот и приходится преобразовывать каждый байт из uchar* в два байта char* - т.е. 0 приводтся к виду "00", а 10 - к "0А"....

                ЗЫ
                а мелкие значения в uchar это и есть кракозябы :) которые либо никак не представлены в читабельном виде, либо выводят какуюто байду...

                ЗЫЫ
                похоже, флейм начался, извините
                  Дык какая разница, загонять файл в char* или в unsigned char* ???? Если ты его открываешь как бинарник, каждый отдельный символ преобразовывать не придеЦа \%).

                  Можно текстовый файл загнать как в char*, так и в unsigned char*. И с бинарником то же самое...
                  Сообщение отредактировано: byte -
                    можно, базару нет :)
                    но
                    когда видишь такой прототип
                    char *add(char *, const char*) - к символьной строке добавить символьную строку и вернуть результат как символьную строку. Результат можно напечатать с помощью printf, например.
                    та же байда но с unsigned-ом выглядит так: (потому, что нет гарантии что там символьные данные)
                    unsigned char *add(unsigned char *, int size1, unsigned const char*, int size2, int &size3);
                    size3 - спорный вопрос, можно не использовать, заменив на size1+size2
                    печатать результат такой функции с помощью printf небезопасно, имхо.
                      Дык нигде нету гарантии, что там символьные данные!
                      Это же просто указатели на память, а в памяти этой может храниться все, что угодно! Тот же самый char* может указывать на какую-нить структуру, класс, просто число!
                      А может содержать строку... И то же самое с unsigned char*! Он тож может указывать хрен знает куды... Так что тут нельзя конкретно сказать, что можно выводить printf'ом, а что нельзя...
                      Все зависит от конкретного случая, конкретных функций,  конкрентых программ...
                        Цитата Andy_KZ, 05.08.03, 12:47:24
                        можно, базару нет :)
                        но
                        когда видишь такой прототип
                        char *add(char *, const char*) - к символьной строке добавить символьную строку и вернуть результат как символьную строку. Результат можно напечатать с помощью printf, например.
                        та же байда но с unsigned-ом выглядит так: (потому, что нет гарантии что там символьные данные)
                        unsigned char *add(unsigned char *, int size1, unsigned const char*, int size2, int &size3);
                        size3 - спорный вопрос, можно не использовать, заменив на size1+size2
                        печатать результат такой функции с помощью printf небезопасно, имхо.

                        :) А если я работаю с кирилицей и хочу явно специфицировать, что char должен представлять значения в диапазоне [0, 255] (т. к. я не могу быть уверен, что в моем компиляторе char беззнаковый)?
                          2SUnteXx:
                          Ну не выдают компиляторы предупреждений при присваивании без явного преобразования знаковому char'у беззнакового или наоборот. Проверь сам.

                          2Flex Ferrum:
                          Строковые литералы в С++ имеют тип const char[], а не const char*. Это разные вещи, но преобразования между этими типами относятся к тривиальным.
                          ExpandedWrap disabled
                            <br>const char* psz = "string1";<br>const char sz[] = "string2";<br>printf("\%d \%d\n", sizeof(psz), sizeof(sz));<br>

                          Будет выведено 4 (размер указателя) и 8 (размер строки).
                            Цитата Relan, 05.08.03, 13:00:27
                            2Flex Ferrum:
                            Строковые литералы в С++ имеют тип const char[], а не const char*. Это разные вещи, но преобразования между этими типами относятся к тривиальным.

                            Согласен. Mea culpa.
                              интересно, многие ли спользуют для строковых данных (нуль-терминированных) тип unsigned char* ?, и для бинарных char*. ?

                              byte "
                              Можно текстовый файл загнать как в char*, так и в unsigned char*. И с бинарником то же самое... "

                              -- исключительно для удобства пользования :) :
                              char* - текст
                              unsigned char* - бинари
                              и всем все понятно....
                              Не пытаются же запихнуть бинарные данные в класс строки, их же все таки пытаются запихнуть в какойнить аррай...


                              Можно, конечно, все к войд со звездой свести... Но пользоваться потом этим всем...
                                Я часто использую char* для бинарных файлов... ::)
                                А в класс строки ты бинарные данные корректно не запихнешь, т.к. все данные "обрубятся" на первом же NULL-chare ;).
                                1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
                                0 пользователей:
                                Страницы: (3) 1 [2] 3  все


                                Рейтинг@Mail.ru
                                [ Script execution time: 0.0860 ]   [ 15 queries used ]   [ Generated: 27.06.26, 14:45 GMT ]