回 帖 发 新 帖 刷新版面

主题:字符串-请MOZ做做

有一字符串:
1.长度不固定
2.分成多行,行数不固定
3.中英文混合
现假设在编辑状态下:
中英文字数位置随机分布,随机输入10行字符,每行20字节
试解决如下问题:
1.光标移到任意位置,如果是中文光标总是处于第一个字节位置
2.换行和删字时不破坏中文(即是不产生乱码)

回复列表 (共5个回复)

沙发

1. 需要定义变量标志行的长度,你做的是每行20个字节,就定为20吧,如果有不固定长度的,还得需要用回车换行符来分割。
2. 我处理中文都是用很笨的办法的:检查有多少个字符 >chr$(128)
   然后再根据字符数的奇偶数来判断是否中文半字。
3. 如果使用的中文系统是UCDOS的话,UCDOS可以提供“整字识别”功能的,所以可以把定位光标中文字前半字这一步省下来。当然,要实现也行。

A. 从字符串的第一个字节开始检查
   (1),ASC码大于127的中文标志+1 ,
          (缺点是无法像UCDOS一样识别制表符,识别制表符还得加函数处理)
   (2),接近行末时(长度等于行长或比行长少1),检查中文标志是否偶数,
          如果有断字现象,把剩余的半字弄到下一行去。(与回车换行符交换位置就可以了)
   (3),检查到光标位置时,记录当前光标位置的中文半字数量。
   (4),一直检查到字符串末,以处理断字问题。
B. 检查光标位置半字标志,如果是偶数,且当前光标位置处>chr$(127),则将光标移前一位(前提是已经处理完断字问题)。
C. 删除换行插入覆盖等功能实现过程中,检查当前位置是否汉字和前面汉字字节数来进行相应处理。

其实ASC码>127也可以换成>159的,看你习惯喜欢哪个都可以的。

板凳

把它写成代码

3 楼

这些东西比较繁琐,
等我有时间了再把写给秋水的函数拿来修改再给你吧。

4 楼

我以前也写过一个文本文件的操作程序,里面就有换行的判断,可惜现在找不到源程序了。方法上与MOZ说的相似。就是先找到第一个ASC码大于127的,再看紧跟着的那个。

5 楼

这段时间的确很烦,今天才拿到时间来做一下,还没加上剪切功能。

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

我来回复

您尚未登录,请登录后再回复。点此登录或注册