Блог пользователя kb.

Автор kb., 13 лет назад, По-русски

Здравствуйте! На Тимусе есть такая задача: http://acm.timus.ru/problem.aspx?space=1&num=1158.


Так вот, к ней прилагается 23-ий тест, который моя правильная (я уверен!) программа не может пройти из-за проблем с символами с кодами больше 127 (как я понял из форума, это первый тест где они появляются).

Это очень обидно, так как я долго решал эту непростую задачу, а тут такая подстава. Объясните пожалуйста, почему с этими символами возникают проблемы (я догадываюсь, что из-за того что первые 128 совпадают во всех кодировках, а дальше нет) и что надо сделать на C++, чтобы их решить.
  • Проголосовать: нравится
  • +4
  • Проголосовать: не нравится

13 лет назад, # |
  Проголосовать: нравится +1 Проголосовать: не нравится

char в C++ знаковый, юзай unsigned char и будет тебе счастье.

unsigned char buf[123123];

scanf("%s", buf);

скорее всего у тебя проблемы с отрицательными символами (символы с кодами больше 127 становятся отрицательными). string s = "ы"; s[0] < 0; т.е. нельзя писать array[s[0]] = blabla;

можно например так делать array[(unsigned char)s[0]] = blabla; 

  • 13 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    С этим типом почему-то не работают gets и strlen :(
    • 13 лет назад, # ^ |
      Rev. 2   Проголосовать: нравится +1 Проголосовать: не нравится

      Прочти книжку по C++. Станет понятнее.

      unsigned char buf[1000];

      gets((char*)buf);

      • 13 лет назад, # ^ |
          Проголосовать: нравится 0 Проголосовать: не нравится
        Да вроде читал несколько :) Но таких тонкостей там не встречал, спасибо!
        • 13 лет назад, # ^ |
          Rev. 2   Проголосовать: нравится 0 Проголосовать: не нравится

          Плохо читал. сейчас когда ты немного можешь программировать чтение книжки поможет понять получше этот язык. Я прочитав несколько книг, и работая не первый год на работе на C++, не перестаю удивляться ему  и все равно узнаю о нем что нибудь новое каждый год.

13 лет назад, # |
Rev. 2   Проголосовать: нравится 0 Проголосовать: не нравится

В общем, я решил что писать свои gets и strlen - больший изврат, чем добавить при считывании вот это:

int chr = buf[i];
if (chr < 0)
    chr = 127 + (129 + chr);

Наконец-то получил желанный AC :) Но все равно интересно, как сделать это попрямее.