Как считывать числа с помощью sscanf до конца строки?
Доброго времени суток, нужно в C/C++ считывать числа типа double с консоли до конца строки, при этом проводить контроль ввода, т.е. если вместо double ввели текст, нужно об этом сообщить. Как это можно реализовать?
То есть предполагается что числа будут вводить в консоль через пробел и их количество неизвестно и ограничения нет, потом вы сохраните эту строку и извлечете числа (sscanf в отличие от scanf не читает из stdin)?
Shetani: не совсем так, в строку сохранить не получится, т.к. может не влезть, иначе бы использовал getline и не парился особо. Нужно читать по одному числу и записывать в массив, пока не встретится конец строки(т.е. Enter).
getline может увеличить предварительно выделенную память если введенная строка не влезает и возвратит новое значение выделенной памяти, используйте getline. crasseux.com/books/ctutorial/getline.html тут описание и пример есть.
sscanf - это жестоко!
Крайне не рекомендую этой дрянью пользоваться.
И да, не надо писать С/С++. Это все равно, что писать "пхытон/перловка". Совершенно ведь разные языки! И если вам в С++ нужен sscanf, то принимайте мои соболезнования!
По поводу конкретного вопроса: читать man strtod до тех пор, пока не придет понимание.
Понятно что разные, но это не мешает использовать библиотеки C в С++ коде. strtod парсит строку, а строка, вводимая в консоль, может просто не поместиться в "string", если будет слишком много чисел, поэтому и нужно читать по одному.
IBM701: куда не поместиться? Что за чушь! Ну, возьмите буфер из 64 чисел. Сделали l = read(1, buf, 63); buf[l] = 0;, а потом double x = strtod(buf, &eptr); и проверили eptr.
Никакой сложности, полный контроль и никаких глюков дурацкой scanf!
IBM701: это что за извращение? Да и вообще, как можно миллион параметров командной строки передать? А если это внутри файла, то есть определенные соглашения, чтобы не допустить подобного бреда.
Ну, да ладно, допустим, что погромист — индюк. И в чем проблема сделать буферизованный ввод? Считываем кусками по N байт. Преобразуем очередное считанное число в double, а остаток (после eptr) memmove'ом перекидываем в начало буфера и дочитываем нужное количество байт, если остаток меньше заданного. Повторяем итерацию.