如何阅读 Eiffel 中的 space 分隔输入?

How would one read space separated input in Eiffel?

我不能真正使用 Io.read_integer 因为它会忽略除了 第一个数字。

我可以使用 Io.read_line 得到类似 15 14 59 86 的东西。 我现在如何将它们拆分成整数?

Javascript 有 split(),C++ 有 stringstream,类似的东西是理想的。

如果只使用一个space,{STRING} class中有一个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

如果您想在整数之间允许多个空格、制表符等,您可以使用 Gobo 库中的 class {ST_SPLITTER}。这是一个例子:

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