[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖
cn-dos上关于字符截取的帖子一坨坨的。。。

%var:~m, n%
m是偏移量,n指定要截取的长度。
“如果两个数字(偏移量和长度)都是负数,使用的数字则是环境变量数值长度加上指定的偏移量或长度”(参见set /?)
m、n是负数时,很容易可以计算出,变量数值长度加上指定的偏移量或长度,截取的正好是倒数第|m|个到倒数第|n|个为止的字符。
偏移量是指相对第一个字符的位置,所以第一个字符的偏移量正好是零,第二个是1…

注意建立偏移量的概念,什么都好理解。编程语言中一个很普遍而基础的概念。
很基础而自然的东西,完全不需要什么总结。
命令行参考:hh.exe ntcmds.chm::/ntcmds.htm
求助者请拿出诚心,别人才愿意奉献热心!
把查看手册形成条件反射!

TOP

回复 6楼 的帖子

m是偏移量,n指定要截取的长度。
记住这一句难道不比你说的那些口诀有用吗?

之所以那么多人提问,其实很多人都是被误导了,反而忘了最本质的东西。像偏移量,很多人根本没有这个概念(虽然这在一定程度上与所掌握的计算机知识有关)。
命令行参考:hh.exe ntcmds.chm::/ntcmds.htm
求助者请拿出诚心,别人才愿意奉献热心!
把查看手册形成条件反射!

TOP

关于m,字符串作为指针时就是偏移量,作为字符数组就是下标。
当然下标的本质就是偏移量。
fwrite("www.bathome.net"+4, 7, 1, stdout);

fwrite(&"www.bathome.net"[4], 7, 1, stdout);
命令行参考:hh.exe ntcmds.chm::/ntcmds.htm
求助者请拿出诚心,别人才愿意奉献热心!
把查看手册形成条件反射!

TOP


%str:~m,n%
len = strlen(str)
m是偏移量,n指定要截取的长度,len是原字符串的长度。
正确的计算方法是:
    ┌, m≥0
m=M=│
    └len+m, m<0 => M=0, if "len+m" is still less than zero(that is while m<-len)

    ┌, n≥0
n=N=│
    └len+n-, n<0(Note here is M, after previous calculation) => N=0, if "len+n-M" is still less than zero

正好推算出,当长度n为负数时,截取字符的终点是倒数第∣n∣个字符之前(不包括此字符)

%str:~m,n% → %str:~M,N%
如果截取长度为零,显然截取结果为空字符串。
=> 长度n为负数时,如果倒数第∣n∣个字符在偏移量前面(=>∣n∣>),则截取长度为0(空字符串)。
=> m,n都为负数时,如果∣n∣>∣m∣,截取长度为0(空字符串)。

命令自带文档:“如果两个数字(偏移量和长度)都是负数,使用的数字则是环境变量数值长度加上指定的偏移量或长度。”
不只翻译有误,英文原文是:
If either number (offset or length) is negative, then the number used is the length of the environment variable value added to the offset or length specified.

文档中对偏移量offset的说明是正确的,而长度length的计算方法不完整。在实际使用中虽然一直是用正确方法,但没怎么注意到文档,原来真的是文档有误,难怪新手不太明白。


[ 本帖最后由 zqz0012005 于 2009-11-13 12:32 编辑 ]
命令行参考:hh.exe ntcmds.chm::/ntcmds.htm
求助者请拿出诚心,别人才愿意奉献热心!
把查看手册形成条件反射!

TOP

返回列表