Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: welchu en 11 Febrero 2014, 10:54 am



Título: Duda con programa - funcion strlen?
Publicado por: welchu en 11 Febrero 2014, 10:54 am
Hola, tengo una duda con el siguiente programa:

Un programa que te pida tu nombre y lo muestre en pantalla separando cada letra de la siguiente con un espacio.
Por ejemplo, si tu nombre es "Juan", debería aparecer en pantalla "J u a n"

No se cómo hacer para separar la palabra pero puedo sacar la primera letra, las otras letras creo que se debe utilizar con la función 'strlen'? Aunque creía que 'strlen' solo indicaba las letras que el usuario ha tecleado.

#include <stdio.h>
#include <string.h>
int main()
{
    char texto[40];
   
    printf("Introduce tu nombre: ");
    scanf("%s", texto);
   
    printf("La primera letra es %c", texto[0]);
   
    //Utilizar strlen()???
   
    getchar();
    getchar();
    return 0; 
}


Alguien me puede ayudar?
Gracias, un saludo


Título: Re: Duda con programa - funcion strlen?
Publicado por: leosansan en 11 Febrero 2014, 11:18 am
Hola, tengo una duda con el siguiente programa:

Un programa que te pida tu nombre y lo muestre en pantalla separando cada letra de la siguiente con un espacio.
Por ejemplo, si tu nombre es "Juan", debería aparecer en pantalla "J u a n"

.............................................................

Strlen te da la longitud de la cadena.

Para lo que quieres basta un bucle, por ejemplo con un for:


Código
  1. #include <stdio.h>
  2. int main()
  3. {
  4.    char texto[40];
  5.    int i;
  6.    printf("Introduce tu nombre: ");
  7.    scanf("%s", texto);
  8.    for (i=0;texto[i];i++)
  9.      printf("%c ", texto[i]);
  10.    getchar();
  11.    getchar();
  12.    return 0;
  13. }

¡¡¡¡ Saluditos! ..... !!!!


(http://st.forocoches.com/foro/images/smilies/aaaaa.gif)




Título: Re: Duda con programa - funcion strlen?
Publicado por: adastra en 11 Febrero 2014, 12:08 pm
Antes que nada, valida la longitud de la entrada del usuario... Si ingresa más de 40 caracteres que pasará? (https://foro.elhacker.net/Smileys/navidad/silbar.gif)
(https://foro.elhacker.net/Smileys/navidad/silbar.gif)


Título: Re: Duda con programa - funcion strlen?
Publicado por: welchu en 11 Febrero 2014, 12:29 pm
Ya he conseguido que funcione el programa:

/*Un programa que te pida tu nombre y lo muestre en pantalla separando cada letra de la siguiente con un espacio.
Por ejemplo, si tu nombre es "Juan", debería aparecer en pantalla "J u a n"*/
#include <stdio.h>
#include <string.h>
int main()
{
    char nombre[40];
    char i;
   
    printf("Introduce tu nombre: ");
    scanf("%s", nombre);
   
    for(i=0; i<strlen(nombre); i++)
    printf("%c ", nombre);
   
    //printf("La primera letra es %c", nombre[0]);
       
    getchar();
    getchar();
    return 0; 
}

Utilizando un bucle for como habéis dicho y con la función strlen que "limpia" las letras que sobran.
Lo único que no se es qué pasaría es si ingresamos más de 40 caracteres. :/


Título: Re: Duda con programa - funcion strlen?
Publicado por: eferion en 11 Febrero 2014, 12:58 pm
Lo único que no se es qué pasaría es si ingresamos más de 40 caracteres. :/

Yo te lo digo... escribirías fuera del buffer y, en ese caso, lo mejor que te puede pasar es que el programa de un error fatal.

revisa este hilo para más información:

http://foro.elhacker.net/programacion_cc/lo_que_no_hay_que_hacer_en_cc_nivel_basico-t277729.0.html (http://foro.elhacker.net/programacion_cc/lo_que_no_hay_que_hacer_en_cc_nivel_basico-t277729.0.html)


Título: Re: Duda con programa - funcion strlen?
Publicado por: Yoel Alejandro en 11 Febrero 2014, 22:21 pm
Lo que plantea eferion es verdad. Una buena manera (sencilla) de limitar la longitud de la cadena de entrada es usar fgets (es lo mismo que explican en el post referenciado). Su prototipo es

Código
  1. fgets( char * buffer, int N, FILE * stream );

donde buffer es la cadena donde será copiada la entrada, N es la mayor cantidad de caracteres copiados al array incluyendo el nulo de terminación (por lo que leerá máximo N-1 caracteres), y stream es el flujo o archivo de donde leerá los datos. Debemos poner "stdin" para lea de la entrada estándar (teclado).

De este modo, reemplaza la sentencia

Código
  1. scanf("%s", nombre);

por

Código
  1. #define N 40
  2. char nombre[N];
  3.  
  4. fgets( nombre, N, stdin );

que leerá máximo 39 caracteres de la entrada estándar.


Título: Re: Duda con programa - funcion strlen?
Publicado por: amchacon en 12 Febrero 2014, 02:16 am
que leerá máximo 39 caracteres de la entrada estándar.
Si, pero se quedará el resto de caracteres "esperando" en el buffer de entrada. Volverán a aparecer cuando pidas otro dato por teclado.

Una solución sería vaciarlo a mano después de utilizar fgets:
Código
  1. void LimpiarBuffer()
  2. {
  3.   int ch;
  4.  
  5.  while ((ch = getchar()) != '\n' && ch != EOF);
  6.  
  7. }


Título: Re: Duda con programa - funcion strlen?
Publicado por: NOB2014 en 12 Febrero 2014, 03:36 am
Hola welchu.
Fíjate si esto también te puede ayudar, el caso que en la función de amchacon no podes llamarla siempre porque si ingresas 6 o más caracteres(relacionado con mi programa) el bucle while queda “patinando” porque nunca encuentra el [Enter] o salto de línea para finalizar.-
Ejemplo: si ingresas “Daniel” el programa leerá “Danie”  5 caracteres y el sexto es para el ‘\n’ que en este caso quedará en el buffer de teclado haciendo que el bucle while nunca finalize.-
Bueno no hace tanto que estudio c y si me equivoco me lo dirán.-


Citar
fgets leerá hasta n-1 caracteres o hasta que lea un retorno de línea (\n).
En este último caso , el carácter de retorno de línea también es leído.-   

Código
  1. #include<stdio.h>
  2. #include<string.h>
  3.  
  4. #define MAX 6
  5.  
  6. int main(void){
  7. char cadena[MAX]={'\0'}, *p=NULL;
  8. unsigned int ch=0;
  9.  
  10. printf("\n\n ----- Programa que muestra el comportamiento de fgets -----");
  11. printf("\n\n Ingrese una frase....:");
  12. fgets(cadena, MAX, stdin);
  13. if((p=strchr(cadena, '\n'))){
  14. *p='\0';
  15. }
  16. else{
  17. while((ch = getchar()) !='\n' && ch!=EOF);
  18. }
  19. printf("\n Ingreso..............:%s", cadena);
  20.  
  21. printf("\n\n Pulse [Enter] para finalizar..."); getchar();
  22. return 0;
  23. }
   

Saludos.
Daniel


Título: Re: Duda con programa - funcion strlen?
Publicado por: leosansan en 12 Febrero 2014, 11:05 am

Es conveniente amigo NOB2014 no apuntarse tantos a costa de otros.

No te cuesta nada comentar que el código que propones es un copy-paste del de xiruko en error_fgets (http://foro.elhacker.net/programacion_cc/error_fgets_solucionado-t407059.0.html).


¡¡¡¡ Saluditos! ..... !!!!


(http://st.forocoches.com/foro/images/smilies/aaaaa.gif)



Título: Re: Duda con programa - funcion strlen?
Publicado por: NOB2014 en 18 Febrero 2014, 03:11 am
Hola welchu.
Te  pongo un complemento más que me había olvidado.-
El else tiene que quedar así:
Código
  1. else{
  2. cadena[MAX-1] = '\0'; /* Esta es la linea que me faltaba  */
  3. while((ch = getchar()) !='\n' && ch!=EOF);
  4. }

Saludos.
Daniel