elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Los 10 CVE más críticos (peligrosos) de 2020


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Duda con strlen [Solucionado]
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Duda con strlen [Solucionado]  (Leído 5,776 veces)
Dark00

Desconectado Desconectado

Mensajes: 9


Ver Perfil
Duda con strlen [Solucionado]
« en: 10 Noviembre 2012, 20:16 pm »

Hola queridos amigos, acabo de registrarme en este magnifico foro, vengo a plantearles una
pequeña duda y es la siguiente:

Tengo pensado leer por ejemplo una frase como esta:
Código
  1. Hola Mundo

Quiero que me devuelva la catidad de letras que contiene esta frase sin el espacio en blanco
he probado con strlen pero esta incluye tembien el espacio, me preguntaba si habria algun metodo de implementar esta exceptuando el espacio, estare pendiente de sus respuestas, gracias

Un saludo amigos!


« Última modificación: 11 Noviembre 2012, 19:37 pm por Dark00 » En línea

0xDani


Desconectado Desconectado

Mensajes: 1.077



Ver Perfil
Re: Duda con strlen
« Respuesta #1 en: 10 Noviembre 2012, 20:52 pm »

Código
  1. int i, j=0;
  2.  
  3. for(i=0; cadena[i]!='\0'; i++)
  4. {
  5.  j++;
  6.  if(cadena[i]==0x20) //Espacio en hexadecimal
  7.     j--;
  8. }
  9.  


« Última modificación: 10 Noviembre 2012, 23:10 pm por 0xDani » En línea

I keep searching for something that I never seem to find, but maybe I won't, because I left it all behind!

I code for $$$
Hago trabajos en C/C++
Contactar por PM
leosansan


Desconectado Desconectado

Mensajes: 1.314


Ver Perfil
Re: Duda con strlen
« Respuesta #2 en: 10 Noviembre 2012, 21:01 pm »

Una forma simple sería:
Código
  1. #include <stdio.h>
  2. #include <string.h>
  3.  
  4. int main()
  5. {
  6.    int i,k,l;
  7.    char cadena [256];
  8.    printf ("Introduce la cadena: ");
  9.    gets (cadena);
  10.    k=strlen (cadena);
  11.    printf ("long: %d",k);
  12.    puts("\n");
  13.    for (i=0;i<k;i++)
  14.        {
  15.            if (cadena[i]==' ')
  16.                k--;
  17.        }
  18.    printf ("long: %d",k);
  19.    return 0;
  20. }
Saludos!.
P.D:El problema en el código de 0xDani es que el primer caracter sea un espacio en blanco, entonces el if se queda en un bucle cerrado.
« Última modificación: 10 Noviembre 2012, 21:11 pm por leosansan » En línea

naderST


Desconectado Desconectado

Mensajes: 625



Ver Perfil WWW
Re: Duda con strlen
« Respuesta #3 en: 10 Noviembre 2012, 21:54 pm »

Código
  1. unsigned int mystrlen(char *s)
  2. {
  3.    unsigned int cont = 0;
  4.  
  5.    for(;*s;s++)
  6.        if(*s != ' ')
  7.            cont++;
  8.    return cont;
  9. }
  10.  
En línea

0xDani


Desconectado Desconectado

Mensajes: 1.077



Ver Perfil
Re: Duda con strlen
« Respuesta #4 en: 10 Noviembre 2012, 23:15 pm »

@leosansan, modificado.

@naderST, muy bueno el codigo, pero se me ocurre una mejora, o al menos no hay que utilizar el if:
Código
  1. unsigned int mystrlen(char *s)
  2. {
  3.    unsigned int cont = 0;
  4.  
  5.    for(;*s;s++)
  6.    *s!=0x20 ? cont++: ;
  7.    return cont;
  8. }

Aunque seguramente el compilador va a generar el mismo codigo, asi queda mas "pro"  :'P
En línea

I keep searching for something that I never seem to find, but maybe I won't, because I left it all behind!

I code for $$$
Hago trabajos en C/C++
Contactar por PM
leosansan


Desconectado Desconectado

Mensajes: 1.314


Ver Perfil
Re: Duda con strlen
« Respuesta #5 en: 10 Noviembre 2012, 23:43 pm »

Inspirado por 0xDani y sin función:
Código
  1. #include <stdio.h>
  2.  
  3. int main()
  4. {
  5.    int i,k=0;
  6.    char cadena [256];
  7.    printf ("Introduce la cadena: ");
  8.    gets (cadena);
  9.    for (i=0;cadena[i]!='\0';i++)
  10.        cadena[i]!=' ' ? k++:0 ;
  11.    printf ("longitud: %d",k);
  12.    return 0;
  13. }
Saludos!.
En línea

Dark00

Desconectado Desconectado

Mensajes: 9


Ver Perfil
Re: Duda con strlen
« Respuesta #6 en: 10 Noviembre 2012, 23:49 pm »

Muchas gracias a todos por su valiosa ayuda; muy buenos codigos todos por cierto, me llamo la atencion el de naderST prodrias explicarmelo, ya que no lo entiendo del todo especificamente en la parte de la condicion del for.
Código
  1. for(;*s;s++)

Un saludo amigos  ;D
« Última modificación: 11 Noviembre 2012, 20:55 pm por Dark00 » En línea

rir3760


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: Duda con strlen
« Respuesta #7 en: 11 Noviembre 2012, 03:22 am »

Bueno, aquí voy de metiche, pedante y [CENSORED]. Con todo espero se tome como una critica constructiva.

pero se me ocurre una mejora, o al menos no hay que utilizar el if:
Código
  1. unsigned int mystrlen(char *s)
  2. {
  3.    unsigned int cont = 0;
  4.  
  5.    for(;*s;s++)
  6.    *s!=0x20 ? cont++: ;
  7.    return cont;
  8. }
Aunque seguramente el compilador va a generar el mismo codigo, asi queda mas "pro"  :'P
Honestamente no. Ello porque el operador "?:" requiere de tres operandos, utilizar solo dos (como en tu caso) es un error.

La recomendación en estos casos es:
A) Si se debe realizar una operación ante una condición dada se utiliza una sentencia de selección (por ejemplo "if").
B) Si se debe elegir uno de dos valores se utiliza el operador "?:"

De nuevo: es una recomendación, nada impide usar el operador "?:" a rajatabla pero en semejante escenario su uso esta a la altura de las palabras reservadas "auto" y "register".

Veamos el ejemplo de leosansan:
Código
  1. cadena[i] != ' ' ? k++ : 0;
Al agregar el cero solo para cumplir con la sintaxis del lenguaje terminamos con una construcción forzada ya que solo nos interesa el incremento del contador, nada mas (y esa es la clave).

Para el caso es mejor:
Código
  1. if (cadena[i] != ' ')
  2.   k++;
En el sentido de ser solo lo necesario.

Un saludo
En línea

C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language
naderST


Desconectado Desconectado

Mensajes: 625



Ver Perfil WWW
Re: Duda con strlen
« Respuesta #8 en: 11 Noviembre 2012, 17:18 pm »

Muchas gracias a todos por su valiosa ayuda; muy buenos codigos todos por cierto, me llamo la atencion el de naderST prodrias explicarmelo, ya que no lo entiendo del todo especificamente en la parte de la condicion del for.

Código
  1. for(;*s;s++)

Un saludo amigos  ;D


Lo que hace es que va recorriendo la cadena, pero con aritmética de apuntadores. Al sumarle uno al apuntador en cada ciclo va a apuntando al siguiente caracter, es decir, va recorriendo la cadena. Lo de *s es equivalente a decir *s != '\0' va haciendo el ciclo mientras el contenido de s, que sería el caracter actual, sea distinto del caracter nulo.
En línea

Dark00

Desconectado Desconectado

Mensajes: 9


Ver Perfil
Re: Duda con strlen
« Respuesta #9 en: 11 Noviembre 2012, 19:17 pm »

Excelente explicacion naderST ahora lo entiedo todo, funciona perfecto tu codigo;
muchas gracias por darte el tiempo de explicarmelo

  Un saludo!
« Última modificación: 11 Noviembre 2012, 19:41 pm por Dark00 » En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
[ANSI C] Split(), strlen(), mid(), Instr(), strcpy(). « 1 2 »
Programación C/C++
BlackZeroX 11 10,275 Último mensaje 14 Enero 2011, 02:35 am
por Littlehorse
[FASM]strlen en ASM
ASM
0xDani 7 5,940 Último mensaje 28 Diciembre 2012, 14:30 pm
por avesudra
[Micro-rutina] strlen - ANSI « 1 2 »
ASM
Karcrack 13 8,069 Último mensaje 4 Abril 2013, 02:14 am
por mr.blood
strlen() y .length()
Programación C/C++
erest0r 4 4,517 Último mensaje 17 Septiembre 2013, 08:25 am
por erest0r
Duda con programa - funcion strlen?
Programación C/C++
welchu 9 4,743 Último mensaje 18 Febrero 2014, 03:11 am
por NOB2014
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines