中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --
联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum
游客 | 登录 | 注册 | 会员 | 搜索 | 中国DOS联盟
中国DOS联盟论坛
现在时间是 2026-09-14 00:07
47,812 主题排行 / 349,916 发帖 / 今日 0 篇 / 48,268 会员排行
DOS批处理 & 脚本技术(批处理室) » 一个按顺序转换字符串的批处理[原创]
可打印版本  3,561 / 9
第1楼 willsort 发表于 2004-01-29 00:00
元老会员 发帖 1,512 积分 4,432
一个按顺序转换字符串的批处理[原创]
To All:


::此程序为批处理中字符串值的顺序转换而编写, 一般作为子程序被其他程序调用, 也可以将此程序稍做修改, 添加入特定批处理程序中作为子模块调用.
@echo off
if == goto %2
if == goto nullargu

:main 主模块: count, match 句参数列表可以根据需要重新设定和增减
set factor=%1
call %0 $ count 1 2 3 4 5 7 8 9
call %0 $ match c d e f g h i j
goto display

:count 计数模块: 根据指定参数 factor 设置变量值 #a1, #a2
if == goto overflow
set #a1=%#a1%-
if not == goto count_2
set #a1=
set #a2=%#a2%+
if == goto overflow
:count_2
if == goto end
shift
goto count

:match 匹配模块: 循环递增变量 #b1, #b2, 若分别与 #a1, #a2 相等, 则指定结果值为当前循环的参数 3.
if == goto overflow
set #b1=%#b1%-
if not == goto match_2
set #b1=
set #b2=%#b2%+
if == goto overflow
:match_2
if == if == set result=%3
if not == goto end
shift
goto match

:display 显示模块: 显示赋值结果
if == echo %factor% convert %result%
set result=
set factor=
set error=
set #a1=
set #a2=
set #b1=
set #b2=
goto end

:nullargu
echo.
echo Error: argument 1 not specified.
echo.
goto end

verflow
echo.
echo Error: number is overflow.
set error=overflow
echo.
goto end

:end

第2楼 Kinglion 发表于 2004-01-30 00:00
铂金会员 发帖 1,924 积分 5,798 来自 金獅電腦軟體工作室
受益非浅,谢谢了。
第3楼 GOTOmsdos 发表于 2004-02-03 00:00
铂金会员 发帖 1,827 积分 5,154
有很多疑问,能不能每一句详细解释一下,让更多的人学会?
第4楼 xiaojun 发表于 2004-02-03 00:00
银牌会员 发帖 499 积分 2,202
有很多疑问,能不能每一句详细解释一下,让更多的人学会?

if == 与if "%1"==""是等同的吧? ; 这里的 if ==这个$代表什么呢?(票子?
第5楼 willsort 发表于 2004-02-03 00:00
元老会员 发帖 1,512 积分 4,432
Re xiaojun:

if == 与if "%1"==""是等同的吧?

是等同的,只是编程习惯不同而已。我想将变量值与常量串的表示分离,但是很多人认为无此必要,我也无法强求。

第6楼 willsort 发表于 2004-02-03 00:00
元老会员 发帖 1,512 积分 4,432
Re xiaojun:

这里的 if ==这个$代表什么呢?(票子?

$与票子没有关系,你到真有想象力。这只是表示当前的运行状态是在子程序中运行,$是SUBROUTINE的首字母缩写的变形,这同样是习惯问题。



第7楼 willsort 发表于 2004-02-03 00:00
元老会员 发帖 1,512 积分 4,432
Re xiaojun:

真要句句详解,工作量太大了,本来我的时间便不充裕。

目前,此类程序仅供达者互相切磋,不宜普及。
第8楼 SagInvoker 发表于 2004-05-24 00:00
初级用户 发帖 38 积分 257
看了之后觉得思路不错,但是有个问题,你的#a2和#b2拿来干什么???
如果SHIFT用了8次都没找到变成了,
根本就没办法累加到
所以
set #a1=
set #a2=%#a2%+
if == goto overflow
根本就没机会执行,除非你一开始就给#a1赋值,但是不太可能吧??
#b2也是如此
所以我实在想不通你设定#a2和#b2有什么目的
不知道你是不是还有什么没说完的话,说来听听~~~~~~
第9楼 chenall 发表于 2004-05-26 00:00
银牌会员 发帖 469 积分 1,276 来自 福建泉州
看不太懂
第10楼 willsort 发表于 2004-06-02 00:00
元老会员 发帖 1,512 积分 4,432
关于按序列转换串的讨论-1
Re SagInvoker:

  感谢SagInvoker兄对此问题的关注,并提出自己的宝贵意见。

  首先需要声明,1楼提供的只是一个样例程序,而非一个通用程序,所以它无法缺省地处理用户的各种需求,而是需要用户根据自己的需求修改源代码。

  程序中的主模块中已经注明转换序列可以重新设定和调整,言外之意是若将它应用在自己的项目中,需要根据自己的需求调整转换序列,大多数时候这项工作是必须的。我在文中使用的12345678和cdefghij只是一个带有很大局限性的示例而已。

  但是,作为程序本身,应该要尽可能的考虑到各种经常会发生的情况,以增强它的适应性。比如实际情况中的转换序列很可能超过10个字符的长度(例如字母表向ASCII码表的转换)。而我在程序中使用到的环境变量#a2和#b2,正是为了解决长序列转换的问题。因为系统的环境空间是有限的,我们如果完全将转换序列计数为相应长度的环境变量,将造成环境空间的用度紧张,所以我将#a2和#b2设计为序列索引的十位数,而#a1和#b1则为个位数。那段你有疑问的代码,实现的是由#a1到#a2的进位运算,它在很多情形下都是需要的。

  所以说,程序中的那段代码虽然在演示的过程中不会执行,但不代表他在所有的情况下都不会执行,即使这些另外的情况需要修改原来的代码。

  当然,程序本身应该可以有进一步的改善,比如说他可以自我处理用户自定义的转换序列,而不需要用户去更改源代码。但是,作为一个带有示意性的项目来说,这些界面问题不属于我们关注的焦点,我们首先需要完成的是核心功能的实现,其次才能考虑界面和框架问题。

  欢迎SagInvoker兄能对此程序进行完善,简化代码或者增加功能,都是可以的。


[ 联系联盟系统管理团队 - 中国DOS联盟 - 标准版 ]
Sponsored by ifanr Inc | © 2001–2023