Могу ли я до вызова scanf определить, есть ли еще в потоке ввода несчитанная информация? Т.е., если я напишу в консоли Код (Text): hello или Код (Text): hello kitty первый вызов scanf вернет "hello", а второй либо вернет "kitty", либо застопит выполнение до получения ввода от пользователя. Нужно заранее определить эти варианты.
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 значит есть еще данные
Даже исходники открывать не надо. Изучение исходника потребует времени больше, чем простая проверка. Мне вот лень даже проверку делать (откуда пишу, не установлено ничего кроме масма, а ставить С лениво), но по логике... "hello kitty" вернет целиком строку. Без измышлений. Вариант "Хелло китти" вернет 0, если ожидаешь ввода числа. Это будет означать, что что-то введено, но под шаблон не попало. Если ждешь 2 строки, получишь "Хелло" и "китти". Если шаблон - 1 строка, получишь всю строку целиком вместе с пробелом. Затрудняюсь сказать, что будет если вызвать дважды, с шаблоном %f первый, и %s второй раз, а ввести те же самые Hello kitty. Тут вариантов может быть 2: - первый вызов вернет 0 и занесет 0 в переменную, второй вызов вернет строку "hello kitty" - первый вызов вернет 0 и занесет 0 в переменную, второй - будет ждать ввода следующей строки (а hello kitty улетят в никуда после первого вызова) Но это легко проверяется - пишешь коротенькую прожку, и смотришь что получится. Вопрос "есть ли несчитанная информация ДО вызова функции" относится к категории "как звучит хлопок одной ладонью". Если программе что-то надо от пользователя - вызываешь функцию. Не колышет, есть что-то уже в буфере, или начнут вводить в момент вызова. Если программе ничего не надо от пользователя - не вызываем функцию. Тогда тем более не колышет есть ли несчитанное. Или я где-то что-то не понял?
FatMoon Колышет. Программа совершит сисколл, если в буфере ничего нету. Если же в буфере лежит достаточно, для данной сканфу форматной строки, то никаких сисколлов не последует. Но я думаю, что хочется знать не про необходимость сисколла, а про то, заблокируется ли программа на этом сисколле, или нет. Кстати, так ли это?