中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

中国DOS联盟论坛
现在时间是 2026-08-08 03:40
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » 如何检查一字符串中相同字符的个数 查看 1,218 回复 13
楼 主 如何检查一字符串中相同字符的个数 发表于 2008-04-12 19:13 ·  中国 江苏 苏州 电信
银牌会员
★★★
积分 1,608
发帖 780
注册 2007-10-07 10:19
18年会员
UID 99089
性别 男
状态 离线
set string=aferefwfwerergrgreaaffwafwa
用bat怎么检查以上字符串中字符a出现的次数(可不能用字符截取功能)
2 发表于 2008-04-12 20:43 ·  中国 江苏 常州 溧阳市 电信
银牌会员
★★★
积分 2,404
发帖 946
注册 2005-09-08 13:44
20年会员
UID 42345
状态 离线

@echo off
set "str=aferefwfwerergrgreaaffwafwa"
:lp
if defined str (
if "%str:~0,1%"=="a" set/a n+=1
set str=%str:~1%
goto lp
)
echo %n%
pause

P处理
本帖最近评分记录 (共 1 条) 点击查看详情
评分人分数时间
huahua0919 +8 2008-04-12 20:52
简单!简单!再简单!
3 我也来一个: 发表于 2008-04-12 20:49 ·  中国 湖南 株洲 电信
金牌会员
★★★★
永远的学习者
积分 3,105
发帖 1,276
注册 2008-03-08 13:00
18年会员
UID 112398
性别 男
状态 离线
思路是计算两段字符长度差:
@echo off&setlocal enabledelayedexpansion
set str=aferefwfwerergrgreaaffwafwa
set var=%str:a=%
for /l %%i in (1,1,100) do if "!str:~%%i,1!"=="" set num1=%%i&goto :1
:1
for /l %%i in (1,1,100) do if "!var:~%%i,1!"=="" set num2=%%i&goto :2
:2
set /a num=!num1!-!num2!
echo 变量中有!num!个a
endlocal
pause>nul


[ Last edited by zw19750516 on 2008-4-12 at 08:53 PM ]
批处理之家新域名:www.bathome.net
4 发表于 2008-04-12 20:52 ·  中国 湖南 株洲 电信
金牌会员
★★★★
永远的学习者
积分 3,105
发帖 1,276
注册 2008-03-08 13:00
18年会员
UID 112398
性别 男
状态 离线
Originally posted by terse at 2008-4-12 20:43:

@echo off
set "str=aferefwfwerergrgreaaffwafwa"
:lp
if defined str (
if "%str:~0,1%"=="a" set/a n+=1
set str=%str:~1%
goto lp
)
echo %n%
pause

高,利用变量移位,的确是高!!!
批处理之家新域名:www.bathome.net
5 发表于 2008-04-12 20:53 ·  中国 广西 玉林 博白县 电信
金牌会员
★★★★
积分 3,687
发帖 1,467
注册 2005-08-08 12:00
20年会员
UID 44210
状态 离线
@echo off
set "str=aferefwfwerergrgreaaffwafwa"
set/p= %str% 中有<nul
:loop
set /a %str:~0,1%+=1&set str=%str:~1%&if defined str goto loop
echo a %a% 个
pause
本帖最近评分记录 (共 3 条) 点击查看详情
评分人分数时间
s11ss +5 2008-04-12 21:03
huahua0919 +4 2008-04-12 21:25
moniuming +4 2008-04-12 22:49
6 发表于 2008-04-12 20:56 ·  中国 江苏 苏州 电信
银牌会员
★★★
积分 1,608
发帖 780
注册 2007-10-07 10:19
18年会员
UID 99089
性别 男
状态 离线
Originally posted by terse at 2008-4-12 08:43 PM:

@echo off
set "str=aferefwfwerergrgreaaffwafwa"
:lp
if defined str (
if "%str:~0,1%"=="a" set/a n+=1
set str=%str:~1%
goto lp
)
echo %n%
pause

厉害!
我也写过个,效率相当底,terse兄的代码不错~
我加分
zh159的代码意思和terse差不多!
zw19750516的也不错,就是效率和通用性都有所降低!
谢谢大家

”一天不来论坛就感觉退步很多,不管你牛还是不牛“
7 发表于 2008-04-12 21:01 ·  中国 北京 华为云
银牌会员
★★★
积分 1,436
发帖 739
注册 2007-10-11 17:44
18年会员
UID 99469
性别 男
状态 离线
set str=%str:~1%

难道这样就不是字符截取了吗??
8 发表于 2008-04-12 21:05 ·  中国 江苏 苏州 电信
银牌会员
★★★
积分 1,608
发帖 780
注册 2007-10-07 10:19
18年会员
UID 99089
性别 男
状态 离线
我原先的意思是用字符串截取然后用findstr判断的,故自认为用字符截取会导致效率相当底,忘却用if判断!
我在写代码时遇到这个问题,所以向大家求助!现在可以解决很多问题了
再次感谢大家
9 发表于 2008-04-12 21:05 ·  中国 北京 鹏博士BGP
银牌会员
★★★
积分 2,098
发帖 566
注册 2007-09-11 07:27
18年会员
UID 97070
性别 男
状态 离线
Originally posted by zh159 at 2008-4-12 08:53 PM:
@echo off
set "str=aferefwfwerergrgreaaffwafwa"
set/p= %str% 中有<nul
:loop
set /a %str:~0,1%+=1&set str=%str:~1%&if defined str goto loop
echo a %a% 个
pause

zh159兄的更牛,统计出了所有不同字母各自出现的次数。
10 发表于 2008-04-12 21:21 ·  中国 江苏 苏州 电信
银牌会员
★★★
积分 1,608
发帖 780
注册 2007-10-07 10:19
18年会员
UID 99089
性别 男
状态 离线
仔细看了zh159兄的代码才发现 原来 set /a 还可以这么用

@echo off
set a=b
set /a a+=1
echo %a%
pause
11 发表于 2008-04-12 22:48 ·  中国 上海 电信
银牌会员
★★★
永远的菜鸟
积分 1,335
发帖 574
注册 2007-11-27 12:50
18年会员
UID 103929
性别 男
来自 广西
状态 离线
5楼就是牛
12 发表于 2008-04-12 23:15 ·  中国 陕西 西安 电信
银牌会员
★★★★
钻石会员
积分 2,278
发帖 1,020
注册 2007-11-19 13:34
18年会员
UID 103127
性别 男
状态 离线
来迟了,这个早有了,大家怎么就没注意精华帖:

批处理字符出现次数统计:
http://www.cn-dos.net/forum/viewthread.php?tid=25182&fpage=1&highlight=&page=1

这个是无奈何版主的:

@echo off

setlocal ENABLEDELAYEDEXPANSION

set str=adadfdfseffserfefsefseetsdg

set /a m=0,n=0,l=0

call :loop

for /f "tokens=1,2 delims==" %%i in ('set 字符:') do (

echo %%i=%%j

if %%j GTR !l! set l=%%j & set m=%%i

)

echo.出现次数最多的%m%=%l%

pause

goto :EOF

:loop

call set m=%%str:~%n%,1%%

if not defined m goto :EOF

set /a "字符:%m%+=1"

set /a n+=1

goto loop



这个是zh159终结版的:

@echo off
setlocal EnableDelayedExpansion
set str=adadfdfseffserfefsefseetsdgadadfdfseffserfefsefseetsdga

:loop
set str$=%str$% %str:~0,1%&set str=%str:~1%
if not "%str%" == "" goto loop

for %%n in (%str$%) do (
set /a .%%n+=1
if !.%%n! GTR !maxN! set maxN=!.%%n!&&set max=%%n)
set .
echo 出现次数最多的:%max%=%maxN%
pause
exit
山外有山,人外有人;低调做人,努力做事。

进入网盘(各种工具)~~ 空间~~cmd学习
13 发表于 2008-04-12 23:51 ·  中国 重庆 电信
版主
★★★★★
积分 9,023
发帖 5,017
注册 2007-05-31 19:39
19年会员
UID 89899
性别 男
状态 离线
zh159 兄的代码果然强大,学习。
14 发表于 2008-04-13 22:43 ·  中国 台湾 中华电信(HiNet)数据中心
初级用户
积分 109
发帖 30
注册 2007-09-05 14:27
18年会员
UID 96621
性别 男
状态 离线

set "str=aferefwfwerergrgreaaffwafwa"

set /p word= word ?
set "str=%str:"=%"
set str="%str%"
call set str=%%str:^%word%=--" "--%%
for %%a in (%str%) do set /a num+=1
set /a num-=1
echo %num%
pause

论坛跳转: