SET EXACT命令的使用

Author: 谢康 Date: 1993-01-08

        这个最简单的菜单有两个选择项“1.**”和“11.***”。完成这个菜单功能的最简单的程序为:
        set  talk  off
        clear
        do  while  .t.
        text
        1.**
        11.***
        endtext
        acce'请输入选择编号……'toa
        do  case
        case  a='1'
        do  完成选择项**的子程序
        wait
        case  a='11'
        do  完成选择项***的子程序
        wait
        endcase
        enddo
        当运行这个菜单程序时,若想执行选择项***的功能,当屏幕上出现“请输入选择编号……”时,从键盘键入“11”,程序执行的是选择项**的功能,而不是选择项***的功能。仔细检查程序似乎没有问题,为什么键入“11”后却执行“1”编号对应的选择项**的功能呢?原来问题出在set exact命令上。
        set exact命令是与字符串比较运算有关的。它的格式是:set exact on/off。
        系统初始引导后处于“off”状态。在使用了命令“set exact on”后,字符串的比较就是严格的了,等号左端的字符串必须和右端的字符串对应字符完全相同,这两个字符串才被认为是相等的。如:
        . ?  '  A B C D E F
        '  =  ' A B C '
        . T .
        . ?  '  1 1
        '  =  '  1 '
        . T .
        . set exact on
        . ? '  A B C E E F '  ='ABC'
        . F .
        . ? '  1 1 '  =  '  1 '
        . F .
        了解了set exact命令的作用后,不难解决文章开头出现的问题。系统初始引导后处于“off”状态,若想执行选择项***的功能,当你从键盘键入“11”后,程序执行中先将你键入的“11”与“1”比较,“11”相当于等号左端的字符串,“1”相当于等号右端的字符串。
        当然,若菜单中的选择项数目少于10时,选用编号0、1、2、……或9,就不会出现这个问题;若选择数目多于10时,若用编号11、12、……等,则会出现这类问题。有些同志在出现这类问题后,检查程序,又觉得没问题,在没办法情况下,选用编号0、1、……9、A、B、C、……Z来作为选择编号。但若选择项再多,必须出现11、12,……19及21、22、……29、……时,这个问题就无法避免,必须在程序中加入,set exaet on命令来解决这个问题。