scanf/stdio

Тема в разделе "LANGS.C", создана пользователем _Juicy, 17 авг 2011.

  1. _Juicy

    _Juicy Active Member

    Публикаций:
    0
    Регистрация:
    12 авг 2003
    Сообщения:
    1.159
    Адрес:
    SPb
    Могу ли я до вызова scanf определить, есть ли еще в потоке ввода несчитанная информация?
    Т.е., если я напишу в консоли
    Код (Text):
    1. hello
    или
    Код (Text):
    1. hello kitty
    первый вызов scanf вернет "hello", а второй либо вернет "kitty", либо застопит выполнение до получения ввода от пользователя. Нужно заранее определить эти варианты.
     
  2. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Use thread Luke.
     
  3. slesh

    slesh New Member

    Публикаций:
    0
    Регистрация:
    6 фев 2009
    Сообщения:
    214
    1) открываем исходники CRT
    2) scanf ведет в vscanf
    3) vscanf ведет в _input_l
    4) _input_l это _tinput_l
    5) _tinput_l берет данные из FILE* stream
    6) раз это FILE* (в частности stdin) то значит можно проверить просто
    7) FILE это _iobuf
    8) _iobuf имеет в себе _cnt который показывает кол-во данных в буфере.

    Значит если ты делаешь scanf("%s", str); то stdin->_cnt вернет тебе 1 (т.е. символ перевода строки) ну или 0 если конец строки.
    Если вернет значение больше 1 значит есть еще данные
     
  4. FatMoon

    FatMoon New Member

    Публикаций:
    0
    Регистрация:
    28 ноя 2002
    Сообщения:
    954
    Адрес:
    Russia
    Даже исходники открывать не надо. Изучение исходника потребует времени больше, чем простая проверка.

    Мне вот лень даже проверку делать (откуда пишу, не установлено ничего кроме масма, а ставить С лениво), но по логике...
    "hello kitty" вернет целиком строку. Без измышлений. Вариант "Хелло китти" вернет 0, если ожидаешь ввода числа. Это будет означать, что что-то введено, но под шаблон не попало. Если ждешь 2 строки, получишь "Хелло" и "китти". Если шаблон - 1 строка, получишь всю строку целиком вместе с пробелом.

    Затрудняюсь сказать, что будет если вызвать дважды, с шаблоном %f первый, и %s второй раз, а ввести те же самые Hello kitty. Тут вариантов может быть 2:
    - первый вызов вернет 0 и занесет 0 в переменную, второй вызов вернет строку "hello kitty"
    - первый вызов вернет 0 и занесет 0 в переменную, второй - будет ждать ввода следующей строки (а hello kitty улетят в никуда после первого вызова)
    Но это легко проверяется - пишешь коротенькую прожку, и смотришь что получится.

    Вопрос "есть ли несчитанная информация ДО вызова функции" относится к категории "как звучит хлопок одной ладонью". Если программе что-то надо от пользователя - вызываешь функцию. Не колышет, есть что-то уже в буфере, или начнут вводить в момент вызова. Если программе ничего не надо от пользователя - не вызываем функцию. Тогда тем более не колышет есть ли несчитанное.
    Или я где-то что-то не понял?
     
  5. r90

    r90 New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2005
    Сообщения:
    898
    FatMoon
    Колышет. Программа совершит сисколл, если в буфере ничего нету. Если же в буфере лежит достаточно, для данной сканфу форматной строки, то никаких сисколлов не последует. Но я думаю, что хочется знать не про необходимость сисколла, а про то, заблокируется ли программа на этом сисколле, или нет. Кстати, так ли это?
     
  6. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    r90
    Только сисколов не хватало до кучи.

    scanf - thread safety. Ещё вариант select.