主题:字符串-请MOZ做做
QB71
[专家分:1300] 发布于 2006-01-03 01:19:00
有一字符串:
1.长度不固定
2.分成多行,行数不固定
3.中英文混合
现假设在编辑状态下:
中英文字数位置随机分布,随机输入10行字符,每行20字节
试解决如下问题:
1.光标移到任意位置,如果是中文光标总是处于第一个字节位置
2.换行和删字时不破坏中文(即是不产生乱码)
5 楼
moz [专家分:37620] 发布于 2006-02-04 11:43:00
这段时间的确很烦,今天才拿到时间来做一下,还没加上剪切功能。
declare function hzbj% (a$, b%)
declare function inputbox$ (x%, y%, h%, l%,p$)
color 7, 0
cls
print inputbox$(2, 2, 10, 20,"在我们中华人民共和国里abc" + chr$(13) + "64564987有什么是我们做不到的?你能告诉我吗?")
end
function hzbj% (a$, b%) '整字检查
if b% <= 1 or b% > len(a$) then exit function
if asc(mid$(a$, b%, 1)) < 128 then exit function
for i = b% to 1 step -1
if mid$(a$, i, 1) > chr$(127) then n% = n% + 1 else exit for
next
hzbj% = n%
end function
defint a-z
function inputbox$ (x, y, h, l,p$)
if y + l > 81 then l = 81 - y
if x + h > 26 then h = 26 - x
v = 1
dim pl(h + 1)
do
color 1, 7
locate x, y, 0
if v < 1 then v = 1
ph$ = space$(h * l)
plen = l
pl(0) = len(p$)
if v > pl(0) then v = pl(0) + 1
pl(1) = 1
k = 0
do
k = k + 1
plen = l
if pl(k) + plen - 1 > pl(0) then plen = pl(0) - pl(k) + 1
plen = plen - hzbj%(mid$(p$, pl(k), plen), plen) mod 2
i = instr(mid$(p$, pl(k), plen), chr$(13))
if i > 0 then
plen = i - 1
pl(k + 1) = pl(k) + plen + 1
else
pl(k + 1) = pl(k) + plen
end if
if v >= pl(k) then
vx = k
vy = v - pl(k)
vz = hzbj%(mid$(p$, pl(k), vy + 1), vy + 1)
if vz > 0 and vz mod 2 = 0 then
vy = vy - 1
v = v - 1
end if
if vy >= l then vy = l - 1
end if
mid$(ph$, k * l - l + 1, l) = mid$(p$, pl(k), plen)
loop until k >= h or pl(k + 1) >= pl(0)
for i = 0 to h - 1
locate i + x, y, 0
print mid$(ph$, i * l + 1, l);
next
locate vx + x - 1, vy + y, 1
if ins then locate , , , 1, 7 else locate , , , 7, 7
do: k$ = inkey$: loop while k$ = ""
select case k$
case chr$(27): exit function
case chr$(0) + chr$(82): ins = not ins
case chr$(0) + chr$(75): v = v - 1 + (mid$(p$, v, 1) > chr$(127))
case chr$(0) + chr$(77): v = v + 1 - (mid$(p$, v, 1) > chr$(127))
case chr$(0) + chr$(71): v = pl(vx)
case chr$(0) + chr$(79): v = pl(vx + 1) - 1
case chr$(0) + chr$(73): v = 1
case chr$(0) + chr$(81): v = pl(0) + 1
case chr$(0) + chr$(72)
if vx > 0 then v = vy + pl(vx - 1)
if v >= pl(vx) then v = pl(vx) - 1
case chr$(0) + chr$(80)
v = pl(vx + 1) + vy
if v >= pl(vx + 2) then v = pl(vx + 2) - 1
if v < 1 then v = pl(0) + 1
case chr$(8)
if v > 1 then
if mid$(p$, v - 1, 1) > chr$(127) then
p$ = left$(p$, v - 2) + mid$(p$, v)
v = v - 1
end if
end if
if v > 1 then p$ = left$(p$, v - 2) + mid$(p$, v)
v = v - 1
case chr$(0) + chr$(83)
if v <= len(p$) then
if mid$(p$, v, 1) > chr$(127) then p$ = left$(p$, v - 1) + mid$(p$, v + 1)
p$ = left$(p$, v - 1) + mid$(p$, v + 1)
end if
case is > chr$(31), chr$(13)
if ins then mid$(p$, v, 1) = k$ else p$ = left$(p$, v - 1) + k$ + mid$(p$, v)
if v <= len(p$) then v = v + len(k$)
end select
loop until k$ = chr$(27) or k$ = chr$(10) or k$ = chr$(9)
locate , , 0
inputbox$ = p$
end function