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
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:#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! ..... !!!!
(http://st.forocoches.com/foro/images/smilies/aaaaa.gif)
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)
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. :/
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 (http://foro.elhacker.net/programacion_cc/lo_que_no_hay_que_hacer_en_cc_nivel_basico-t277729.0.html)
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
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
scanf("%s", nombre);
por
#define N 40
char nombre[N];
fgets( nombre, N, stdin );
que leerá máximo 39 caracteres de la entrada estándar.
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:
void LimpiarBuffer()
{
int ch;
while ((ch = getchar()) != '\n' && ch != EOF);
}
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
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)
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