Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - nicolasblues86

#21
y una forma es como te mostré recién usando fgets y utilizando un variable auxiliar...

de ultima si tenes problemas con el nuevo codigo que estas haciendo postealo y nos fijamos porque no imprime nada


Saludos Coridiales :D
       
#22
no entiendo para que haces que 'vect' sea un puntero de puntero si lo que queres hacer es reserva la cantidad justa de memoria para la cantidad de palabras ingresadas, se puede hacer que vect sea tan solo un puntero a char :

para empezar te quisiera corregir un pequeño error, cuando pones

   

vect = (char*) calloc(sizeof(char),n);



no esta del todo bien, deberías poner:

   

vect = (char*) calloc(n, sizeof(char) );



es decir  ponías los parámetros al revés

puntero = (tipo*) calloc (numero de elementos, tamaño de cada elemento)

con esto reservarías la cantidad de mem justa que necesitas con respecto a hacer  mas dinámico el programa y no tener que ingresar el numero de la cantidad de palabras, podrías usar fgets :



int ext;
char* vect;
char cadena[50];

fgets (cadena, 50, stdin );

ext = strlen(cadena) + 1// se le suma uno porque se cuenta el fin de cadena

vect = (char*) calloc(ext, sizeof(char) );




Bueno creo que eso es todo

Saludos
#23
Programación C/C++ / ok
19 Mayo 2010, 03:16 AM
pregunta que hice hace dias en el lugar equivocado, la cual ya tengo clara 
#24
siguiendo la logica que estas utilizando lo mejor seria hacer un vector de 100 elementos  que inicializas con los numeros de esta manera


numeros[] {"uno", "dos", "tres"} //..etc

y despues haces un for de 1 a 10 y haces esta sentencia


printf ("el numero ingresado es : %s", numero[m[j] -1])

Entonces si el primer elemento del array que el usuario carga es un dos se imprimira el elemento 2 - 1 del array numero  osea el elemento 1, es decir "dos"    
#25

{
  int *lista;
  int i;
 
  lista = (int*)malloc(sizeof(int)*10);
  for(i = 0; i < 10; i++)
  {
    printf("Ingrese elemento N %d\n",i);
    scanf("%d", &lista[i]);   
    printf("puntero a punta a : %p\n", lista);
    printf("VALOR DE DICHA DIRECCION de mem: %d\n", lista[i]); 
   
  }
 
  free(lista);
  puts("Terminado");
 

return 0;
}




así funciona joya, no se si es de la manera que querías


Saludos




#26
Hola Gente!!

BUENO ESTO ES UNA EXPLICACIÓN DE PORQUE AVECES EL SCANF SE COMPORTA DE MANERA EXTRAÑA. ESPERO QUE SE ENTIENDA,  

voy explico porque el uso de scanf no es recomendable..
para empezar es un error decir que un programa lee del teclado en verdad lo que hace es leer de un area de memoria llamado "buffer de teclado" (no siempre es así, esto se puede manipular mediante la función  setvbuf y el modo _IOFBF, que especifica que lea hasta que el buffer esté lleno.) y el buffer del teclado es "buffer de linea" esto quiere decir que los datos que provienen del teclado se insertan linea por linea y no caracter a caracter . Es por eso que cuando leemos de ahí, por más que ingresemos muchos caracteres, hasta que no ingresamos el fin de línea (enter) el programa no lee nada y se queda trabado esperando que haya algo en el buffer.

si el buffer no está vacío, sí o sí hay al menos un fin de línea;
el buffer siempre tiene un carácter de fin de línea al final.

El gran problema con scanf es que no siempre leerá el fin de linea lo que nos lleva a que el buffer quede con basura, osea con caracteres no leídos los cuales la próxima vez que invoquemos a scanf los leerá e intentara limpiar el buffer ocasionando un salto de linea e impediendonos ingresar el dato requerido.  de mas esta decir que esto podría causar algunos problemas al programador.
scanf solo lee hasta que encuentre el formato que le especificamos, esto conlleva a otro gran problema ya que si nosotros le decimos que lea un entero (%i") y se le ingresan 2 enteros separados por un espacio scanf solo leerá hasta encontrar el formato especificado dejando al buffer sucio con ese entero de mas.
Otro problema que tenemos es que no hace casi ningún tipo de chequeo a la hora de verificar los datos ingresados si se le indica que se ingresara un entero y el usuario ingresa una letra esté hace una conversión a entero lo cual genera un problema.


en el siguiente segmento de programa intenten lo siguiente cuando les piede ingresar los datos pongan algo así como "50 10" (sin las comillas) y veran como el buffer quedara  sucio  con con el entero 10 entonces cuando se llama de nuevo a scanf "asimila" que 10 es lo que se ingreso y por eso no nos deja ingresar el dato e imprime el nuevo valor de i       



nt main(int argc, char** argv)
{
int i;

scanf ("%d", &i );
printf ("%d\n",i);
scanf ("%d", &i );
printf ("%d",i);


return 0;


}





por estas razones no es recomendable usarlo siempre se puede suplantar con algo que no ensucie el buffer para eso utilsaremos sscanf y fgets :




#include <stdio.h>



int main()
{
  char nombre[20]="", entrada[81]="";
  unsigned int edad=0;

  printf( "Escriba su nombre y edad, separados por un espacio:\n" );
  fgets(entrada, 20, stdin ); //llenamos el buffer reservando 20 caracteres y stdin es la entrada standar
  sscanf( entrada, "%s %u", nombre, &edad ); //con sscanf introducimos lo que tenemos en el buffer tanto en nombre como en edad    

  printf( "Has escrito: %s\n", entrada ); //lo que tenemos en el buffer
  printf( "Nombre: %s. Edad: %d\n", nombre, edad ); //

 

El uso de fgets puede traer inconvenientes menores los cuales son  solucionables no voy a profundizar en este tema ya que ya hay un pequeño post que habla del mismo

bueno eso es todo...

Saludos Cordiales
#27
Hola gente bueno les cuento que tengo un incomeniente con un programa que genera un archivo de texto y pone datos en él hasta ahí va perfecto
el problema es cunado quiero tomar esos archivos e imprimirlos en pantalla
no se si estoy tomando mal los datos del archivo o estoy ingresando mal los datos en el archivo, pero el tema es que me termina imprimiendo dos veces la ultima linea del archivo...


Bueno al final era un problema con como imprimía en pantalla lo que havia en el archivo de texto   




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


typedef struct {
char *nm;
int dia;
int ms;
int aa;
char mes[11];
}Persona;



void entrada (Persona* p);
char* mes_asci (int n);


int main(int argc, char** argv)
{
FILE *pff;
char fn[] = "Personas.DAT";
char buf[121];

if ( (pff = fopen(fn,"a+t")) == NULL )
{
puts ("Error al abrir archivo");
exit (-1);
}

//while (!feof(pff))
       while (fgets (buf,121,pff))
      {

printf ("%s \n\n",buf);
 
}



Persona pt;

entrada (&pt);
fprintf(pff,"%s %d-%d-%d %s\n", pt.nm, pt.dia, pt.ms, pt.aa, pt.mes);

fclose(pff);
return 0;
}



void entrada (Persona * p)
{
char bf[80];

printf ("Escriba el nombre: ");
fgets (bf,80,stdin);
if (bf[strlen(bf) - 1] == '\n' )
bf[strlen(bf)] = '\0';
p->nm = (char*) malloc ((strlen (bf) + 1) * sizeof(char));
strcpy (p->nm, bf);
do
{
printf ("introduzca dia mes año (dd mm aaaa) : ");
fgets (bf, 80, stdin);
if (bf[strlen(bf) - 1] == '\n' )
bf[strlen(bf)] = '\0';
sscanf (bf,"%d %d %d%*c", &p->dia, &p->ms, &p->aa );
printf ("\n %s\n", mes_asci(p->ms));

} while  ( ( mes_asci(p->ms) == "Mes eroneo") || (p->dia > 31 || p->dia < 1 ) );

strcpy(p->mes, mes_asci(p->ms));

}

char* mes_asci (int n)

{
static char *mes[12] = {
"Enero", "Febrero", "Marzo", "Abril",
"Mayo", "Junio", "Julio", "Agosto", "Septiembre",
"Octubre", "Noviembre", "Diciembre" };

 
if (n >= 1 && n <= 12)
return mes[n-1];
else
return "Mes eroneo";


}






#28
Programación C/C++ / Re: truncar teclado!
13 Mayo 2010, 05:57 AM
Mil Gracias pero voy a tener un problema me olvide de especificar que tengo linux
 
#29
Programación C/C++ / truncar teclado!
13 Mayo 2010, 03:45 AM
Hola a todos!!

bueno tengo una pequeña duda estaba pensando en que si hay alguna manera de poder truncar o bloquear las teclas cuando se pide que se igresen datos, me explico, supongamos que se pide que se ingrese una cadena y a la hora de teclear por ejemplo la etra "n", nisiquiera se imprima en pantalla cuando la presiono... se que deve haber  alguna manera con directivas o algo asi
yo me imagino que puede ser revisando primero las letras que uno presiona con una funcion como getchar o algo asi pero no se me ocurre del todo como implementarlo
bueno espero que puedan ayudarme

os dejo Saludos.......
 
#30
pero te compila ??