Duda con programa - funcion strlen?

Iniciado por welchu, 11 Febrero 2014, 10:54 AM

0 Miembros y 2 Visitantes están viendo este tema.

welchu

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

leosansan

Cita de: 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"

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

Strlen te da la longitud de la cadena.

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


Código (cpp) [Seleccionar]
#include <stdio.h>
int main()
{
   char texto[40];
   int i;
   printf("Introduce tu nombre: ");
   scanf("%s", texto);
   for (i=0;texto[i];i++)
     printf("%c ", texto[i]);
   getchar();
   getchar();
   return 0;
}


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





adastra

Antes que nada, valida la longitud de la entrada del usuario... Si ingresa más de 40 caracteres que pasará? :silbar:
:silbar:

welchu

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. :/

eferion

Cita de: welchu en 11 Febrero 2014, 12:29 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

Yoel Alejandro

#5
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 (cpp) [Seleccionar]

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 (cpp) [Seleccionar]

scanf("%s", nombre);


por

Código (cpp) [Seleccionar]

#define N 40
char nombre[N];

fgets( nombre, N, stdin );


que leerá máximo 39 caracteres de la entrada estándar.
Saludos, Yoel.
P.D..-   Para mayores dudas, puedes enviarme un mensaje personal (M.P.)

amchacon

Cita de: yoel_alejandro en 11 Febrero 2014, 22:21 PMque 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 (cpp) [Seleccionar]
void LimpiarBuffer()
{
   int ch;

  while ((ch = getchar()) != '\n' && ch != EOF);

}
Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar

NOB2014

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.-


Citarfgets 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.-   

#include<stdio.h>
#include<string.h>

#define MAX 6

int main(void){
char cadena[MAX]={'\0'}, *p=NULL;
unsigned int ch=0;

printf("\n\n ----- Programa que muestra el comportamiento de fgets -----");
printf("\n\n Ingrese una frase....:");
fgets(cadena, MAX, stdin);
if((p=strchr(cadena, '\n'))){
*p='\0';
}
else{
while((ch = getchar()) !='\n' && ch!=EOF);
}
printf("\n Ingreso..............:%s", cadena);

printf("\n\n Pulse [Enter] para finalizar..."); getchar();
return 0;
}
   

Saludos.
Daniel
abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-

leosansan


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.


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




NOB2014

#9
Hola welchu.
Te  pongo un complemento más que me había olvidado.-
El else tiene que quedar así:
else{
cadena[MAX-1] = '\0'; /* Esta es la linea que me faltaba  */
while((ch = getchar()) !='\n' && ch!=EOF);
}


Saludos.
Daniel
abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-