一个读取空间如何在Eiffel中分隔输入?

时间:2018-11-11 10:01:07

标签: input stream eiffel

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

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

JavaScript具有split(),C ++具有stringstream,类似的东西很理想。

2 个答案:

答案 0 :(得分:3)

如果仅使用一个空格,则split类中有一个{STRING}方法。 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

答案 1 :(得分:2)

如果要在整数之间允许多个空格,制表符等,可以使用Gobo库中的类{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