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

[文本处理] 我的字符串大小写互换的代码错在哪里?

本帖最后由 悬崖之树 于 2013-2-8 18:46 编辑

里面的变量:
str 待处理字符串
m 英文小写字符表
n  英文大写字符表
a  用来按顺序取得str里的每一个字符
c 保存由a指定的字符
b  在for循环中的计数器,用来存取待处理字符在字符表里的序号
d 用不同的值表示待转换字符是在m还是n中找到的,如果d等于3的话,就说明不是英文字符,直接输出。
out 接收每个转换好的字符
  1. @echo off&setlocal enabledelayedexpansion
  2. set str=asDFGhjklQ
  3. set m=abcdefghijklmnopqrstuvwxyz
  4. set n=ABCDEFGHIJKLMNOPQRSTUVWXYZ
  5. set a=-1
  6. :loop
  7. set /a a+=1
  8. set c=!str:~%a%,1!
  9. if "%c%" equ "" goto end
  10. for %%i in (a b c d e f g h i j k l m n o p q r s t u v w x y z) do (
  11.    set /a b+=1
  12.    if "!c!" == "%%i" set d=1&goto out
  13. )&set b=-1
  14. for %%i in (A B C D E F G H I J K L M N O P Q R S T U V W X Y Z) do (
  15.    set /a b+=1
  16.    if "!c!" == "%%i" set d=2&goto out
  17. )&set b=-1
  18. set d=3
  19. :out
  20. if %d%==1 set out=%out%!m:~%b%,1!
  21. if %d%==2 set out=%out%!n:~%b%,1!
  22. if %d%==3 set out=%out%%c%
  23. goto loop
  24. )
  25. :end
  26. echo %out%
  27. pause
复制代码
我的想法是通过for循环找到字符串里每个字符在字符串%m%或%n%里的序号,如果该字符时在%m%里找到的,那么只要输出%n%里相同序号的字符就可以了。
时光荏苒||新陈代谢&&涛声依旧||本性难移

目测 b 永远等于 -1,因为每个循环后都要执行一次 set b=-1,就把原来的值覆盖了

TOP

1、建议用 for 代替 goto,一方面是可读性比较高,另一方面是效率会高很多
2、另一方面,发现楼主爱用 goto 可能是不知道怎么对变量延迟嵌套
这两点都可以参考下随风的旧帖,细看必有收获:http://bbs.bathome.net/viewthread.php?tid=4831

TOP

但是在for循环里我用goto out 不是已经跳到 set b=-1 之后了吗?
  1. for %%i in (a b c d e f g h i j k l m n o p q r s t u v w x y z) do (
  2.    set /a b+=1
  3.    if "!c!" == "%%i" set d=1&goto out
  4. )&set b=-1
复制代码
时光荏苒||新陈代谢&&涛声依旧||本性难移

TOP

返回列表