Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Función gets no añade "\0"?

Estas en el tema de Función gets no añade "\0"? en el foro de C/C++ en Foros del Web. buenas! Para hacer una clasificación por puntos en un juego, necesito leer el archivo de puntuaciones y buscar si el usuario aparece en dicho archivo. ...
  #1 (permalink)  
Antiguo 05/01/2010, 09:34
 
Fecha de Ingreso: octubre-2008
Mensajes: 64
Antigüedad: 15 años, 7 meses
Puntos: 1
Función gets no añade "\0"?

buenas!

Para hacer una clasificación por puntos en un juego, necesito leer el archivo de puntuaciones y buscar si el usuario aparece en dicho archivo. Si aparece, necesito escribir en el archivo la mayor puntuación que haya hecho. Si no aparece, pues lo coloco y punto.

He hecho un programilla que funciona bien si no comprouebo si está, pero a la que intento usar strcmp() me da resultados erróneos, y no sé dónde la estoy cagando.

Pongo el programa:

Código C:
Ver original
  1. #include <stdio.h>
  2. #include <string.h>
  3.      struct UsuariPuntuacio{
  4.             char nom[25], data[10];
  5.             int punts;
  6.             struct UsuariPuntuacio *seg;
  7.      };
  8.  
  9. int main()
  10. {
  11.     struct UsuariPuntuacio *punt_primer, *punt_aux, punt, punt_actual;
  12.     int punts, n_resultats=1, i=0, jugador_no_exist=1;
  13.     char Jugador[25], data[25];
  14.      
  15.      FILE *fitxer;
  16.      
  17.      fitxer=fopen("Puntuacions2.txt", "r+");
  18.  
  19.      if(fitxer==NULL)
  20.      {
  21.        printf("Error llegint el fitxer.");
  22.        fclose(fitxer);
  23.      }else{        
  24.          punt_primer=&punt;
  25.          punt_aux=&punt;
  26.          
  27.          gets(Jugador); // Es convertirà en la variable "Jugador"
  28.          gets(data); // Es convertrà en la variable "data", que s'ha de crear i demanar a l'usuari
  29.          scanf("%d", &punts);  // Es convertirà en la variable "punts"
  30.          
  31.          fgets(punt.nom, 25, fitxer);
  32.          fgets(punt.data, 11, fitxer);
  33.          fscanf(fitxer,"%d\n",&punt.punts);
  34.          
  35.          while (feof(fitxer)==0)
  36.          {
  37.                (*punt_aux).seg = (struct UsuariPuntuacio*)malloc(sizeof(struct UsuariPuntuacio));
  38.                punt_aux=(*punt_aux).seg;
  39.                fgets((*punt_aux).nom, 25, fitxer);
  40.                fgets((*punt_aux).data, 11, fitxer);
  41.                fscanf(fitxer,"%d\n",&(*punt_aux).punts);
  42.                n_resultats++;
  43.          }
  44.          fclose(fitxer);
  45.          
  46.          punt_aux=punt_primer;
  47.          printf("%d", n_resultats);
  48.          i=0;
  49.          puts(Jugador);
  50.          printf("%d", strlen(Jugador));
  51.          while(i<n_resultats && jugador_no_exist!=0)
  52.          {
  53.               jugador_no_exist=strcmp(Jugador, punt_aux->nom);printf("Valor de jugador_no_exist: %d", jugador_no_exist);
  54.               i++;
  55.               puts(punt_aux->nom);
  56.               printf("Llargada de l'usuari %d: %d\n", i,strlen(punt_aux->nom));
  57.               punt_aux = (*punt_aux).seg;
  58.          }printf("%d", i);
  59.          if (jugador_no_exist ==0) printf("Jugador existeix");
  60.      }
  61.      getch();
  62.      
  63. }

El archivo "Puntuacions.txt" (de dónde saco las puntuaciones) tiene esta estructura:

Código:
Joan López
10/10/2007
10540
Pere Valls
15/10/2007
10230
Anna Garcia
05/10/2007
8500
El problema que tengo, como he dicho, es al usar strcmp() aquí:
Código C:
Ver original
  1. while(i<n_resultats && jugador_no_exist!=0)
  2.          {
  3.               jugador_no_exist=strcmp(Jugador, punt_aux->nom);printf("Valor de jugador_no_exist: %d", jugador_no_exist);
  4.               i++;
  5.               puts(punt_aux->nom);
  6.               printf("Llargada de l'usuari %d: %d\n", i,strlen(punt_aux->nom));
  7.               punt_aux = (*punt_aux).seg;
  8.          }printf("%d", i);
  9.          if (jugador_no_exist ==0) printf("Jugador existeix");

Si al ejecutar el programa pongo los siguientes datos:

Código:
Anna Garcia
05/01/2010
500
(sólo me importaa la primera línea, el nombre) Este nombre está en el archivo, pero strcmp() me dice que no, que "Anna Garcia" del archivo es más largo (12 carácteres) que el "Anna Garcia" que he escrito yo (11 carácteres).

Puede ser que la función gets() no añada el carácter "\0" al final de la cadena??

Cómo puedo solucionarlo?

Muchísimas gracias :D

Nota: He probado de añadir este carácter con strcat() así: strcat(Jugador, "\0"); pero tampoco funciona.

En cambio, si pongo strcat(Jugador, "a\0"); (atención a la a) añade la letra, pero no el carácter final...
  #2 (permalink)  
Antiguo 05/01/2010, 11:26
 
Fecha de Ingreso: octubre-2008
Mensajes: 64
Antigüedad: 15 años, 7 meses
Puntos: 1
Respuesta: Función gets no añade "\0"?

Al final lo he solucionado (perece) haciendo un poco de guarrerías... Me explico:

fgets añade al final de cada cadena los carácteres "\n" (retorno de carro) y "\0" (esto en mi caso; si el último carácter fuera un espacio y luego un reotrno de carro también los añadiría), o sea que el problema no está en gets, sino en fgets.

Cómo solucionarlo? ues añadiendo, claro está, el carácter "\n" a la cadena que leo por teclado:

Código C:
Ver original
  1. gets(Jugador);
  2. strcat(Jugador, "\n");

El único problema que tengo ahora es que todo sale un poco raro, porque si hago un puts(Jugador), el siguiente printf sale dos línias más abajo, pero se puede solucionar quitando (otra vez) el "\n" que he añadido con Jugador[strlen(Jugador)-1]='\0';

Alguna solución mejor?
  #3 (permalink)  
Antiguo 05/01/2010, 16:37
 
Fecha de Ingreso: abril-2008
Mensajes: 141
Antigüedad: 16 años, 1 mes
Puntos: 0
Respuesta: Función gets no añade "\0"?

Hace 2 años que no leo un fichero en C, pero creo recordar que con fgets te leia TODA la frase, incluyendo el \n. El \0 te lo coloca automaticamente, al igual que el scanf.

Tu mismo te has respondido:
fgets (Jugador);
Jugador[strlen(Jugador)-1]='\0';

Estudias en la salle?
  #4 (permalink)  
Antiguo 05/01/2010, 16:58
 
Fecha de Ingreso: octubre-2008
Mensajes: 64
Antigüedad: 15 años, 7 meses
Puntos: 1
Respuesta: Función gets no añade "\0"?

Pues sí, parece que tienes razón, fgets lo lee todo. Y no, no estudio en la Salle. Por qué lo dices?

Etiquetas: Ninguno
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 02:56.