Duda con uso del "for" para almacenar caracteres y flotantes en "C"

Iniciado por RicGeo, 17 Septiembre 2014, 17:55 PM

0 Miembros y 1 Visitante están viendo este tema.

RicGeo

Hola amigos de Elhacker.net quisiera su ayuda esta vez con el almacenamiento de caracteres y flotantes en el "for" donde tengo que almacenar varios datos : nombre y codigos .Por ejemplo:
paloer  234234.56323 2342.563
loerto   454353.4564 23423.6722
setra  43534.56754 7864.6573

#include<stdio.h>
  #define MAX 13
  int main(){
  int i,j,k,n;
  double p[MAX][1];
  char nombre[MAX];
  FILE *txt;
  printf("Numero de datos:\n");
   scanf("%d",&n);
  txt=fopen("Lista_datos.txt","r");
  if(!txt)
    printf("Error no existe archivo\n");
  else{
    for(i=0;i<n;i++)
    fscanf(txt,"%s %lf %lf",&nombre[MAX],&p[i][0],&p[i][1]);// Obviamente acá el uso de la lectura de los caracteres está mal usado, aquí es donde quisiera su ayuda
     for(i=0;i<n;i++)
    printf("%s %lf %lf",nombre[i],p[i][0],p[i][1]);
    }
    fclose(txt);
    return 0;}

Quisiera como utilizar o hay un comando especial como poder trabajar con estos caracteres que varian para poder trabajar con estos datos .. agradecería bastante ayuda . Saludos!!!

eferion

double p[MAX][1];

Esta declaración no tiene demasiado sentido. Si pretendes almacenar dos números en cada posición de "p" tienes que declarar la variable así:
double p[MAX][2];

De esta forma, para cada p dispones de dos espacios, uno para cada numero.

Ahora vamos con las cadenas:

char nombre[MAX];

Esta declaración está mal. Las cadenas de caracteres no se usan exactamente igual que el resto de "tipos nativos". Me explico:

Si intentas almacenar "hola" en C necesitas (al menos) 5 bytes de memoria... si en cambio intentas almacenar "mensaje", la cantidad de memoria requerida asciende a 8 bytes. En cambio, en un int todos los números van a ocupar 4 bytes... ya estés almacenando el 0 o el 5.234.045.

Dicho esto, cada cadena de caracteres es, como su propio nombre indica, una secuencia de tipo "char". Esto quiere decir que "char nombre[MAX]" únicamente te va a permitir almacenar una cadena de caracteres... cuya longitud máxima será MAX-1. Si tu idea es poder almacenar MAX cadenas de caracteres diferentes la declaración debería quedar así:

char nombre[MAX][20];

Esto suponiendo que cada "nombre" no vaya a ocupar más de 19 caracteres.

Si miramos ahora el bucle for, tenemos:


for(i=0;i<n;i++)
    fscanf(txt,"%s %lf %lf",&nombre[MAX],&p[i][0],&p[i][1]);


Esto, como bien has indicado, está mal. Aplicando los cambios que hemos comentado anteriormente, este bucle debería lucir más o menos así:


for(i=0;i<n;i++)
    fscanf(txt,"%s %lf %lf",&nombre[i],&p[i][0],&p[i][1]);


Fíjate que ha desaparecido toda referencia a "MAX", lo cual tiene sentido, ya que intentamos guardar cada nombre en una posición diferente.

Consejos finales:

* Deberías validar que "n" se encuentra dentro del rango [1..13], ya que si te da por poner una cantidad superior vas a escribir en memoria que no te pertenece y eso te va a dar problemas.

* Deberías poner a las variables nombres con significado propio, "p" o "n" no dicen absolutamente nada y eso dificulta la lectura del código.

* Deberías tabular el código con criterio, mejoras la legibilidad del código.

Un saludo.