Batch - Contar letras de una variable

Iniciado por carlitos.dll, 28 Julio 2008, 22:02 PM

0 Miembros y 1 Visitante están viendo este tema.

carlitos.dll



::CarlitoS.dll
::Función que cuenta los carácteres de una variable
@echo off
setlocal enabledelayedexpansion

set /p palabra=Ingrese una palabra con espacios si quiere:

if defined palabra (call :length %palabra: =_%)
if defined %palabra: =_%.length (echo !%palabra: =_%.length!)

pause

goto :eof

:length
if "%*"=="" (goto :eof)
set arg=%*
set word=%*
set word=%word: =_%
set /a cont=0
:loop
if not defined word (goto end)
set word=%word:~1%
set /a cont +=1
goto loop
:end
set %arg: =_%.length=%cont%
goto :eof



$hyDow

if defined? []:! nunca lo vi, puedes explicar un poco el code? pinta interesante

Novlucker

Bueno, creo que carlitos.dll puede explicarlo mejor... pero if defined  lo que hace es comprobar el valor de una variable, si la variable tiene algún valor (aunque sea un espacio), devuelve un verdadero, de lo contrario devuelve un falso  ;)

Saludos
Contribuye con la limpieza del foro, reporta los "casos perdidos" a un MOD XD

"Hay dos cosas infinitas: el Universo y la estupidez  humana. Y de la primera no estoy muy seguro."
Albert Einstein

Darioxhcx

esto estaba en los ejecicios puestos x SmartGenius no ?
yo tmb los iba ahacer hasta q llegaste y dijiste "los voy a hacer todos"
y perdio la gracia xD

pero sos una maa en batch man
saludos

carlitos.dll

#4
If defined lo que hace es preguntar si una variable está definida.

Como al principio del code tengo un set /p palabra=Ingrese texto

si le haces un enter sin escribir nada, el cmd hace:
set palabra=
y borra esa variable.
Podría emularse así también: if not "%variable%"=="" pero no queda tan bien porqué si la variable contiene un " al principio el cmd se confunde con el código, y para eso hay que escribir más

call :length %palabra: =_%

significa que le paso un parametro a :length sustituyendo los espacios por _ lo que no significa que el contenido de la variable no pueda tener espacios, pero es para que no me los elimine al pasarlo por parametro. Ejemplo:
palabra=[espacio][espacio]abc
palabra tiene 5 caracteres

y si comienza con espacio y termina con espacio se borran si llamo a una función (función trim :D). Ejemplo:
call :length %palabra%
hace
call :length   abc
y pasa solo abc

:length
recibe todos los parametros en variable arg y en variable word
variable word redundantemente reemplaza los espacios por _ (aunque ahora pienso que se podría borrar esa línea porque ya viene con el reemplazo desde arriba) establecemos el cont en 0, y luego vamos eliminando un carácter por ciclo repetitivo, y aumentado el cont en 1, cuando ya no queden más letras, tendremos un set word= y la borramos, cuando word ya no está definida salimos del ciclo, y establecemos una variable con el nombre del parametro.length con el contenido de cont.  Ejemplo:

call :length   abc
call :length __abc
set __abc.length=%cont%

Luego cuando se sale de :length pregunta
¿está definida  __abc.length? si así es imprime dicha variable, esta vez ayudado por setlocal enabledelayedexpansion porque antes lo tenía así:
call echo %%%palabra: =_%.length%%
pero si el contenido de la variable comenzaba con un numero, el cmd se confundia al hacer un %1 y no imprimia bien.

carlitos.dll

Actualizo el código


::CarlitoS.dll
::Función que cuenta los carácteres de una variable
@echo off
setlocal enabledelayedexpansion

set /p palabra=Ingrese una palabra con espacios si quiere:

if defined palabra (call :length %palabra: =_%)
if defined %palabra: =_%.length (echo !%palabra: =_%.length!)

pause

goto :eof

:length
set arg=%*
if not defined arg (goto :eof)
set word=%arg%
set /a cont=0
:loop
if not defined word (goto end)
set word=%word:~1%
set /a cont +=1
goto loop
:end
set %arg: =_%.length=%cont%
goto :eof

$hyDow

buena explicación
estoy aprendiendo mucho de tus codes

carlitos.dll

#7
Soluciono un pequeño bug:
al ingresar "" se muestra en pantalla la salida de set

Solución:

::CarlitoS.dll
::Función que cuenta los carácteres de una variable
@echo off

set /p palabra=Ingrese una palabra con espacios si quiere:

if defined palabra (call :length %palabra: =_%)
if defined [%palabra: =_%.length] (call echo %%[%palabra: =_%.length]%%)

pause

goto :eof

:length
set arg=%*
if not defined arg (goto :eof)
set word=%arg%
set /a cont=0
:loop
if not defined word (goto end)
set word=%word:~1%
set /a cont +=1
goto loop
:end
set [%arg: =_%.length]=%cont%
goto :eof

celticsoft

#8
_