C/Visual C - AYUDA: scanf y cin

 
Vista:

AYUDA: scanf y cin

Publicado por javier (54 intervenciones) el 22/09/2000 00:00:00
Hola:
como puedo solucionar el problema que a veces se me presenta cuando estoy en un ciclo y quiero imgresar dos o más datos? El problema es que la 1ra. vez puede ingresarlos y la 2da. vez ya no. Por ejemplo:

char Cad[30];
float Salario ;
for (i=1; i<=10,i++)
{
scanf("%s", Cad) ; // o cin << Cad
scanf("%f", &Salario) ; // o cin << Salario
}

Muchas gracias de antemano
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:AYUDA: scanf y cin

Publicado por Endos (143 intervenciones) el 22/09/2000 00:00:00
Estas sobreescribiendo los valores a cada paso de bucle.

char Cad[10][30];
float Salario[10] ;
for (i=0; i<10, i++) // Los bucles deben empezar en 0 para guardar en arreglo
{
scanf("%s", Cad[i]) ; // o cin << Cad
scanf("%f", &Salario[i]) ; // o cin << Salario
}

Saludos,
Endos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE: NO EXPLIQUE BIEN! scanf y cin -

Publicado por Javier (54 intervenciones) el 22/09/2000 00:00:00
Hola Endos y gracias...pero creo que no me hice entender. En el ejemplo que di, la primera vez que el ciclo se realiza,puede ingreso el par de datos (o sea la cadena y el float). A partir de la segunda vez solo puedo ingresar el segundo dato es decir el salario. Aclaro que no estoy trabajando con vectores, luego de ingresar los datos y dentro del mismo ciclo se procesan estos..
En un libro y luego del ingreso de los datos (y dentro del ciclo) decia algo asi:
while( getchar() != ´\n´); servirá esto para solucionar mi problema? o cual será la idea de este pequeño blucle? explicame por favor el funcionamiento de getchar() que me confundo un poco bastante(?).
En el ejemplo que me das con tus correcciones es lo mismo char Cad[10][30] que char *Cad[10] ?. el primero no es una matriz de 10*30? y el segundo un vector de 10 punteros a char? Se supone que en char Cad[10][30] se pueden guardar 10 cadenas? Por favor ruego me aclares esto...
Muchas gracias por responder mis dudas
Javier
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE: NO EXPLIQUE BIEN! scanf y cin -

Publicado por un aprendiz (12 intervenciones) el 22/09/2000 00:00:00
Hola, ante todo perdonen que me introduzaca en su conversación, pero quería colaborar para solucionar tu problema;la verdad, no hace mucho tiempo que programo, pero intentaré solucionar tus dudas:
En primer lugar, salvo pequeños errores de sintaxis que tu compilador cantará y lo de los indice del array, no veo el error. Puedes probar a borrar el buffer del teclado con fflush(stdin), donde stdin es el flujo hacia el buffer de entrada (consola); Como podrás observar este código es casi idéntico y funciona correctamente...

#include <stdio.h>
...
...
char *cad;
float salario;
register int i;

for (i=0;i<=9;i++)
{
scanf("%s",cad);
fflush(stdin);// Borra el buffer de entrada (teclado)
scanf("%f",&salario); fflush(stdin);

printf("cad: %s\n",cad);
printf("salario: %f\n",salario);

printf("Pulsa una tecla...");
getchar(); // Espera a que pulse tecla
fflush(stdin);
}
...
...

Por otra parte, el funcionamiento de getchar es muy simple: int getchar (void); que devuelve un entero que es un caracter leído del flujo de entrada (stdin). En realidad es un macro y equivale a la sentencia: putc(stdin); Tambien hay una función similar en conio.h: int getch (void); pero esta última no muestra el caracter por pantalla...
La sentencia: while(getchar!=´\n´); solo lee un caracter hasta que este sea el retorno de carro, cuando termina el bucle.
La diferencia entre: char c
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE: NO EXPLIQUE BIEN! scanf y cin -

Publicado por un aprendiz (continuacion) (12 intervenciones) el 22/09/2000 00:00:00
Perdon, se me corto el mensaje, continuo...
La diferencia entre: char cad [10] [30]; ,y, char cad *[10]; es que la primera sentencia declara 10 cadenas de 30 caracteres cada una, en la segunda se declaran 10 punteros a cadenas de caracteres (lo mismo que tu decías), y cada uno de estos apunta a una cadena de hasta 255 (o algo así) caracteres.
Con char cad [10] [30] se pueden guardar 10 cadenas de hasta 30 caracteres cada una.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE: NO EXPLIQUE BIEN! scanf y cin -

Publicado por Endos (143 intervenciones) el 22/09/2000 00:00:00
Ok, entonces es seguramente como dice el aprendiz, el uso de
fflush(stdin); para obligar a obtener los datos tras las entradas.

Una cosa aprendiz, si declaras "char *cad;" y luego usas "scanf("%s",cad); "
directamente lo estas haciendo mal, debes reservar memoria con antelacion.

cad= new char[ByteSolicitados];

y cuando termines de usala liberar la memoria

delete []cad;

Si no se soluciona con el fflush() habria que mirar el codigo integro
para ver que pasa.

Saludos,
Endos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE: NO EXPLIQUE BIEN! scanf y cin -

Publicado por Endos (143 intervenciones) el 22/09/2000 00:00:00
char Cad[10][30] son 10 punteros char de 30 elementos cada uno.
char *Cad[10] son 10 punteros a cadena char.

El primero tiene memoria preasignada. Caben cadenas de como mucho
29 caracteres mas el NULL que va al final siempre.
El segundo caso es necesario asignar memoria a cada uno
antes de usarlo.

Cad[0]= new char [50]; // cadena de 50 bytes
Cad[1]= new char[100]; // Esta de 100

Como puedes ver puede tener cada una una longitud.
Cuando dejen de usarse deben liberarse:

delete [] Cad[0];
delete [] Cad[1];
...

getchar() lo que hace es esperar hasta que se pulsa una tecla devolviendo su valor.
´\n´ representa un salto de linea. Eso lo que haria seria leer uno a uno cada
caracter introducido. No creo que sea necesario por las caracteristicas del programa.
Creo que el problema es la necesidad de usar siempre fflush(stdin);
detras de cada scanf() para asegurarse se lee la entrada.

scanf();
fflush(stdin);

Saludos,
Endos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE: NO EXPLIQUE BIEN! scanf y cin -

Publicado por un aprendiz (12 intervenciones) el 23/09/2000 00:00:00
Endos,te doy las gracias por las aclaraciones a mi respuesta; ya que como dije, no tengo mucha experiencia, gracias... tú simempre dispuesto a ayudar, así da gusto, deberían pagarte porque haces horas extras :-D. Sigue así.

Tengo una dudilla, ahí va: ¿por que si declaras un puntero a char e introduces la cadena tomando como referencia dicho puntero, sin haberlo inicializado, es posible tabajar con dicha cadena sin haber inicializado el puntero (en tiempo de ejecución en este caso) para que apuntase a una cadena (declarada dinámicamente con new ó malloc).
Esque he observado en varios códigos escritos en C (en C++ creo que no le visto, aunque aquí si que soy novicio), que para declarar una cadena lo que hacen es declarar un puntero a cadena y trabajar con él como si de una cadena se tratase? (no sólo con aritmética de punteros, sino también pasándola a función y utilizando índices?

Por favor, te rogaría que me aclarase un poco el temilla porque el C es tan flexible que, a veces no se hasta donde, y me lio... Muchas gracias de antemano por gastar tu tiempo.


Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE: NO EXPLIQUE BIEN! scanf y cin -

Publicado por Endos (143 intervenciones) el 23/09/2000 00:00:00
Jeje! No estaria mal que cobrase por ayudar, estoy en numeros rojos... ;)

Si haces esto:

char *Cadena="Esto es una prueba"; // Correcto, el compilador guarda espacio
char *Puntero;
char *Puntero2;

Puntero=Cadena; // Correcto, No copiamos nada en Puntero, solo apuntamos a Cadena

strcpy(Puntero,"Prueba"); // Correcto, estamos sobreescribiendo Cadena
strcpy(Puntero2,"Hola mundo"); // Incorrecto, Puntero2 no tiene memoria reservada

Puntero2= new char [15];
strcpy(Puntero2,"Hola mundo"); // Correcto, ya reservamos memoria
strcat(Puntero2,", que tal estan?"); // Incorrecto, la longitud tota de la cadena supera los 15 bytes reservados

En muchos de estos casos el compilador no marca absolutamente nada,
debido a que no se comprueban los punteros. Es la parte mas delicada
y a la que debemos prestar mayor atencion! Un puntero escribiendo
fuera de rango, tarde o temprano hara caer nuestro programa.

Saludos,
Endos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE: NO EXPLIQUE BIEN! scanf y cin -

Publicado por un aprendiz (12 intervenciones) el 23/09/2000 00:00:00
Te doy infinitas gracias Endos; ahora que lo dices, si que he recordado haber leído (aunque evidentemente no me acordaba) en un manual de C que el compilador no realiza comprobación de punteros (claro, no me daba error)y el especial cuidado que hay que poner en ellos, lo he buscado y he termindado de aclararme las cosas...Gracias por tu ayuda ¡¡ DESINTERESADA !! :-)

Un Saludillo del aprendiz ;-)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE: NO EXPLIQUE BIEN! scanf y cin -

Publicado por Javier (54 intervenciones) el 25/09/2000 00:00:00
MUCHAS GRACIAS POR TU COLABORACION
Javier
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar