以下是我的空间删除任务的艾菲尔代码:
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
我运行了代码,得到的输出与要求略有不同,比如说,当行中有拖尾空格时,我总是得到一个额外的空间。
这是我的输出:
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
有人可以帮我吗?
答案 0 :(得分:2)
当您阅读第一个空格字符时,请勿立即打印。等待下一个非空格字符打印它,如果你得到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