Как можно было бы прочитать пробел, разделенный на вход в Eiffel?

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

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

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

Всего 2 ответа


Если вы используете только одно пространство, в классе {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

Если вы хотите разрешить несколько пробелов, вкладок и т. Д. Между целыми числами, вы можете использовать класс {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

Есть идеи?

10000