1. C++ / Говнокод #12704

    +10

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    {//НАЧАЛО ВРЕМЕННОГО БЛОКА ПОЛУЧЕНИЯ КОДА
    try
    {
    	int q=quan-pos;
    	char* temp=new char[q+1];//Временный буфер под код.
    	for(int i=0;i<q;temp[i]=buf_temp[pos+(i++)]);
    	//В цикле копируем в этот буфер символы кода.
    	temp[q]=0;//Завершаем строку буфера нулём.
    	code=atoi(temp);
    	delete[]temp;
    }
    catch(...)
    {
    	//Проверка на вшивость, учитывая возможный размер кода, излишня, но всё же не помешает, поскольку не тормозит систему.
    	code=0;
    }
    }//КОНЕЦ ВРЕМЕННОГО БЛОКА ПОЛУЧЕНИЯ КОДА

    Когда-то давно (школопериод) выпало изучать обмен данными по сети на С++.
    В задании выше - кусок функции ListenSockets(), которая принимала по сети форматированную строку и парсила.
    В те годы про strtok() я еще не слыхал...

    Запостил: Bart, 08 Марта 2013

    Комментарии (5) RSS

    • нахуя скоупы в капсе?
      Ответить
      • Соль не в капсах. Вот полный код:
        http://pastebin.com/suhzGK5x
        Временный блок тут вообще не нужен. Равно как и далее по тексту функции.
        Ответить
    • Зачем strtok? В С число от строки неплохо отрезается через strtol примерно так:
      char *p;
      // strtol пропустит пробелы, затем распарсит число в указанной системе счисления
      // при успехе в p будет указатель на первый нецифровой символ, в code - число
      // при неудаче в p будет buf_temp + pos, а в code 0
      // если число слишком большое - в code будет LONG_MIN или LONG_MAX.
      code = strtol(buf_temp + pos, &p, 10);
      if (buf_temp + pos == p) {
          /* обрабатываем ошибку - вместо цифр попался мусор */
      } else {
          pos = p - buf_temp;
      }
      Большой плюс sttrol в данной ситуации в том, что он в отличие от sttrok'а не портит строку, и не надо вызывать дурацкий atoi/atol, не умеющий сообщать об ошибках.
      Ответить
      • Да, есть такое. Но про такую функцию тем более я тогда не знал:)

        Только сейчас предпочитаю для таких конвертаций sscanf().
        Ответить
        • Если набор полей постоянный и парсится вся строка целиком - sscanf удобен.
          Если же набор полей зависит от значений предыдущих (а такое довольно часто встречается), то sscanf, к сожалению, ничем не поможет, т.к. не возвращает количества обработанных символов, и продолжить разбор строки не удастся.

          P.S. Сейчас выложу свой ГК о сканфе.
          Ответить

    Добавить комментарий