Тут размещают свои топики новички в С/С++.

Тема в разделе "LANGS.C", создана пользователем nitrotoluol, 4 мар 2007.

  1. Ailinor

    Ailinor New Member

    Публикаций:
    0
    Регистрация:
    26 сен 2007
    Сообщения:
    7
    Так нельзя, если у него p указывает на uchar, то захватишь ещё несколько левых байт, как он и продемонстрировал выше :)
     
  2. maxdiver

    maxdiver Max

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    308
    Адрес:
    Саратов
    varnie
    Если у тебя в char лежит '0', то получить число так:
    *p - '0'
     
  3. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Э, да, я неверно прочёл.

    Имеется символ, надо получить числовое значение. Можно так:
    Код (Text):
    1. unsigned char buf[2] = {*p, 0};
    2. unsigned value = atoi((char*) buf);
    Ailinor
    Не, можно — сначала получаем char, который преобразуется в unsigned int.

    Не, там не было левых байт.

    И добавлю к #340:
    Если у тебя указатель на один символ, то можно либо преобразовать его в строку (как в начале поста), либо привести напрямую: *p-'0'; // '0' = 0, '9' = 9.
     
  4. Ailinor

    Ailinor New Member

    Публикаций:
    0
    Регистрация:
    26 сен 2007
    Сообщения:
    7
    Почему нет, *((uint)*p) - четыре байта читаешь, а там реально только 1.
     
  5. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Это даже не скомпилируется :)

    А я всё же настаиваю на том, что прочитается только 1 символ:
    Код (Text):
    1.     char* p = "0123";
    2.     int i = (int)*p;
    3.     printf("i=%d\n", i);
    Чтобы 4 байта прочитать, надо так: int i = *(int*)p;
     
  6. Ailinor

    Ailinor New Member

    Публикаций:
    0
    Регистрация:
    26 сен 2007
    Сообщения:
    7
    Сорри, я скобками промазал ))))
     
  7. varnie

    varnie New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2005
    Сообщения:
    1.785
    понял. разобрался. значит я изначально тоже верное решение предложил. но второй способ запомню все же. спасибо что подсказали!
     
  8. KeSqueer

    KeSqueer Сергей

    Публикаций:
    0
    Регистрация:
    19 июл 2007
    Сообщения:
    1.183
    Адрес:
    Москва
    Есть msvs 2005
    Создаю Console Project
    Нужно использовать класс string. Вот с этим проблемы. Он вообще есть? Если есть, то приведите пример, плз, как создать объект этого класса.
     
  9. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    а в чем трабла?
    Код (Text):
    1. #include <string>
    2.  
    3. std::string some_str = "123";
     
  10. wsd

    wsd New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2007
    Сообщения:
    2.824
    или можно вначале прописать
    Код (Text):
    1. using namespace std;
    и тогда все стринги просто string можно писать ,а не std::string .
    Если их много то текста становится меньше.
     
  11. KeSqueer

    KeSqueer Сергей

    Публикаций:
    0
    Регистрация:
    19 июл 2007
    Сообщения:
    1.183
    Адрес:
    Москва
    Спасибо! Про namespace совсем забыл.
     
  12. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Лучше using std::string. Хотя, это больше вопрос стиля.
     
  13. varnie

    varnie New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2005
    Сообщения:
    1.785
    здравствуйте.
    можно ли переписать следующий кусочек кода:
    Код (Text):
    1. int symbol;
    2. //_pFileIn - валидная переменная типа FILE*, полученная после успешного открытия файла.
    3. fread( &symbol, 1, 1, _pFileIn );
    4. std::string str = "";
    5. std::map< int,, std::string > m;
    6. //m заполнена данными, среди которых уже есть ключ, равный int значению symbol
    7.                    
    8. for (std::map<int, std::string >::const_iterator iter = m.begin(); iter != m.end(); ++iter)
    9. {  
    10.     char c = iter->first;
    11.     if ( c== (char)symbol )
    12.     {  
    13.             printf(" %c = %s\n", iter->first, iter->second.c_str() );
    14.         str= iter->second;                 
    15.         break;
    16.         }
    17. }
    при помощи алгоритма find() ? тут какие-то тонкости с преобразованиями int->char или что-то в этом духе. спасибо.

    пробовал что-то в духе:
    Код (Text):
    1.     std::map<int, std::string >::const_iterator iter = m.find( (char)symbol );
    2.     if ( iter != m.end() )
    3.        {
    4.                printf(" %d = %s\n", iter->first, (iter->second).c_str() );
    5.             str = iter->second;                
    6.         }
    , но не во всех случаях срабатывает.
     
  14. wsd

    wsd New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2007
    Сообщения:
    2.824
    varnie
    у тебя же в мапе ключ инт и simbol определён как int
    так зачем
     
  15. varnie

    varnie New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2005
    Сообщения:
    1.785
    да, знаю. не упустил из виду! но почему-то m.find( symbol ) не находит нужный элемент. мне именно это и интересно узнать, почему так.
     
  16. wsd

    wsd New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2007
    Сообщения:
    2.824
    varnie
    а он точно там есть?(этот ключ)
    выведи на экран весь мап и посмотри
     
  17. varnie

    varnie New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2005
    Сообщения:
    1.785
    wsd,
    сейчас выяснил вот что:
    я заполнял map с ключами - буквами.
    т.е. если вывести значение какого-нить элемента map как int значение, то увидим что-то типа: 672012662.
    при считывании int значения из файла и выводе его как int значение, видим что-то типа: 134546038.
    т.е. это по идее 2 int значения одной и той же буквы "v".
    если в первом и во втором случае вывести значение как char, то получим: "v".
    не понятно, откуда эти разные int представления одной и той же буквы получились.

    т.е. если изначально при добавлении элементов в map делать: map[(char) int_variable ] = "test"; вместо map[ int_variable ] = "test";
    , а здесь в куске кода выше вместо int symbol обозначить его как char symbol, то поиск find() будет работать.
     
  18. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    varnie
    а не проще написать typedef std::map<char, std::string> charmap_t и использовать char в качестве ключа? Тогда и глюки пропадут.
     
  19. wsd

    wsd New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2007
    Сообщения:
    2.824
    1. ты считываеш не инт а байт в инт
    2.
    оно же у тебя стринг!(это класс!!!)
    то что в таком случае выведется зависит от значения стринга и реализации конкретной STL...
    3. лучше вкратце накатай TЗ
     
  20. varnie

    varnie New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2005
    Сообщения:
    1.785
    IceStudent,
    угу, воспользовался вашим советом, и при считывании символа из файла считываю его в char переменную. и проблема исчезла:) спасибо.
    но ведь интересно, в чем была фишка выше!

    wsd
    я не так выразился. выше имелось ввиду, что если вывести значение самих ключей как инт-значения. ведь сами ключи имеют тип int.