sscanf? (Си)

Тема в разделе "WASM.BEGINNERS", создана пользователем iZzz32, 26 сен 2007.

  1. iZzz32

    iZzz32 Sergey Sfeli

    Публикаций:
    0
    Регистрация:
    3 сен 2006
    Сообщения:
    355
    Читаю строки из файла (fgets). Пример строки: "1234 17a4 "bla-bla-bla"\n" (формат: шестнадцатиричное-число пробелы-или-табуляция шестнадцатиричное-число пробелы-или-табуляция строка-данных-в-кавычках). Как разбить эту строку на составные части (на ассемблере просто -- руками, а как на Си?), причём, не просто разбить, но и проверить на правильность (что числа -- действительно числа, между ними whitespace, строка в кавычках, а после неё только \n). Что-то вроде sscanf(..., "%x%*[\x20\t]%x%*[\x20\t]%*[\"]%32s%*[\"]%*[\n]", ...) (тоже мне, регэксп, блин!), но тогда никак не узнать, были ли в конце кавычка и \n, а при указании строки-данных больше 32 символов какие-то странные глюки. Помогите!

    PS: Всё моё общение с scanf/sscanf раньше ограничивалось "%d"...
    PPS: А может, есть способ проще? Может, стоит строку руками разбивать?
     
  2. roman_pro

    roman_pro New Member

    Публикаций:
    0
    Регистрация:
    9 фев 2007
    Сообщения:
    291
    strtok ?
     
  3. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    regexp?
     
  4. iZzz32

    iZzz32 Sergey Sfeli

    Публикаций:
    0
    Регистрация:
    3 сен 2006
    Сообщения:
    355
    roman_pro: со strtok я совсем запутался (с кавычками).
    IceStudent: да я лучше руками разберу!!!
     
  5. wsd

    wsd New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2007
    Сообщения:
    2.824
    iZzz32
    ну зачем мучатся?
    делай как сказал IceStudent!
    качай pcre(regexp) c http://gnuwin32.sourceforge.net
    и будет у Вас всё чётко и красиво:)
     
  6. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    iZzz32
    Руками — это по-нашему. В конце концов, не такая сложная грамматика в твоём случае, велосипед вполне сойдёт, если будет работать и устроит тебя. Просто regexp — дёшево и сердито :)
     
  7. r90

    r90 New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2005
    Сообщения:
    898
    так ведь заморока в том, что приведённая строка scanf делает почти то что надо... если бы автор ещё только собирался бы её сочинять, не зная что есть scanf, то, пожалуй, велосипед был бы проще. а так...

    насчёт %32s, может лучше написать %32[^"]? и, я точно не помню, но разве 32 должна стоять в поле width? по-моему в precision.
    а проверить наличие "\n -- тут либо воспользоваться %n -- которая пишет в очередной аргумент количество прочитанных символов, либо читать их в переменную, и разглядывать потом что scanf return'ом вернула.
     
  8. wsd

    wsd New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2007
    Сообщения:
    2.824
    Небольшой оффтоп

    На тему руками вспомнилось...
    Тут не так давно на РБК канале показывали
    передачу про IT технологии и компании:)
    Там какая-то западная компания проводила исследования
    насчёт успешности проектов и сроков сдачи...
    На первом месте ГОЛЛАНДЦЫ на последнем мы!!!!!!!!!!!!!!
    Если бы они перед этим провели исследования
    чьи коммерсанты самые жадные и безбашенные на сроки - то
    мы бы точно только по этому на последнем месте не были!!!!
    А ещё эти чёртовы велосипеды тормозят нас до невозможности!!!!!
    Ну возьми ты паблик путный и пользуйся.
    Но нет мы сами!
    Хочеш отличится - сделай то чего нет и положи на паблик;)
    Используй чужое и делись за это своим... Так сложно???????????
     
  9. iZzz32

    iZzz32 Sergey Sfeli

    Публикаций:
    0
    Регистрация:
    3 сен 2006
    Сообщения:
    355
    wsd, к сожалению, я не юниксоид, и не могу себе позволить из-за такой ерунды таскать за собой ещё и библиотеку-камаз для работы с регэкспами… Я уж как-нибудь сам, на велосипеде... r90 спасибо, значит, с sscanf продолжу (плохо я читал документацию, плохо!).