Как можно прочитать входные данные, разделенные пробелом, в Eiffel? - PullRequest
0 голосов
/ 11 ноября 2018

Я не могу действительно использовать Io.read_integer, так как это просто игнорирует все, кроме первый номер.

Я могу использовать Io.read_line, чтобы получить что-то вроде 15 14 59 86. Как бы я теперь разделил их на целые числа?

Javascript имеет split(), C ++ имеет stringstream, что-то подобное было бы идеально.

Ответы [ 2 ]

0 голосов
/ 12 ноября 2018

Если вы хотите разрешить несколько пробелов, табуляции и т. Д. Между целыми числами, вы можете использовать класс {ST_SPLITTER} из библиотеки Gobo. Вот пример:

local
    l_line: STRING
    l_splitter: ST_SPLITTER
    l_list: DS_LINKED_LIST [INTEGER]
do
    io.read_line
    l_line := io.last_string
    create l_list.make
    create l_splitter.make_with_separators (" %T")
    across l_splitter.split (l_line) as l_split loop
        if l_split.item.is_integer then
            l_list.put_last (l_split.item.to_integer)
        end
    end
0 голосов
/ 12 ноября 2018

Если вы используете только один пробел, в классе {STRING} есть метод split. Аргументом метода split является {CHARACTER} вместо {STRING}. Таким образом, вы должны использовать ' ' вместо " ". Вот небольшая функция, которая делает то, что я думаю, что вы хотите.

split_to_integer_list(a_string:STRING):ARRAYED_LIST[INTEGER]
        -- Convert `a_string', a space separated list of integer
        -- into a {LIST} of {INTEGER}
    local
        l_split:LIST[STRING]
    do
        l_split := a_string.split (' ')
        create Result.make (a_string.count)
        across l_split as la_split loop
            if la_split.item.is_integer then
                Result.extend(la_split.item.to_integer)
            end
        end
    end
...