编码 space 删除时如何删除最后一个 space

How do I get rid of the last space when coding space removal

这是我的 space 移除任务的埃菲尔代码:

feature {NONE} -- Main routine
copy_file
-- Copy a file character by character from input to output
require

input_open: input.is_readable
output_open: output.is_writable
local flag: INTEGER

do
flag := 0       -- 0 for previous space, 1 for previous char
from read_char  -- Must prime the pump by reading the first character
until ch = EOF
loop
    from
        ch := input.last_character
    until
        ch = EOL
    loop
        if ch = Space_char and flag = 0 then        -- leading spaces
            read_char
        elseif ch /= Space_char and flag = 0 then   -- see first charater after space
            output.putchar (ch)
            flag := 1
            read_char
        elseif ch = Space_char and flag = 1 then    -- see space after characters
            output.putchar (Space_char)
            flag := 0
            read_char
        elseif ch /= Space_char and flag = 1  then  -- see character after character
            output.putchar (ch)
            read_char
        end
    end
    flag := 0
    read_char
end

  -- At end of file, nothing to do in Eiffel except close the files
input.close
output.close
end

这是示例输入:

          Leading spaces
Training spaces                     
     Leading and trailing spaces                     
Only    interword     spaces
     Leading,    trailing     and      interword     spaces         
This line has correct spaces

Previous line was empty

Previous line has only leader spaces
OneWordLine
Three word line

我运行代码和我得到的输出与要求略有不同,比如说,我总是得到额外的space是行中的拖尾 spaces。

这是我的输出:

Leading spaces
Training spaces 
Leading and trailing spaces 
Only interword spaces
Leading, trailing and interword spaces 
This line has correct spaces

Previous line was empty

Previous line has only leader spaces
OneWordLine
Three word line

有人可以帮我吗?

当您读到第一个 space 字符时,不要立即打印它。等待下一个非 space 字符打印它,如果你得到 EOL 字符,你就不会打印它。这是您修改后的算法:

feature {NONE} -- Main routine
copy_file
-- Copy a file character by character from input to output
require

input_open: input.is_readable
output_open: output.is_writable
local flag: INTEGER

do
flag := 0       -- 0 for previous space, 1 for previous char
from read_char  -- Must prime the pump by reading the first character
until ch = EOF
loop
    has_read_space := False
    from
        ch := input.last_character
    until
        ch = EOL
    loop
        if ch = Space_char and flag = 0 then        -- leading spaces
            read_char
        elseif ch /= Space_char and flag = 0 then   -- see first charater after space
            if has_read_space then
                output.putchar (Space_char) -- Print the space when reading a character
                has_read_space := False
            end
            output.putchar (ch)
            flag := 1
            read_char
        elseif ch = Space_char and flag = 1 then    -- see space after characters
            has_read_space := True  -- Don't print it right now
            flag := 0
            read_char
        elseif ch /= Space_char and flag = 1  then  -- see character after character
            output.putchar (ch)
            read_char
        end
    end
    flag := 0
    read_char
end

  -- At end of file, nothing to do in Eiffel except close the files
input.close
output.close
end