Avatar billede ulja03 Nybegynder
24. maj 2004 - 06:15 Der er 4 kommentarer og
1 løsning

Jeg får grå hår - struct og fil-skrivning

Jeg er rådvild... hvad pokker sker der her. Jeg har i en struct defineret en char name[15] som jeg naturligvis skal have et navn i. Når jeg benytter nedestående funktioner, bliver der dog af en eller anden grund fyldt mere end 15 pladser i name-arrayet. Den fylder fint et evt. navn ind, men laver i samme øjeblik to underlige tegn på name[15] og name[16].

Hvad har den gang i og hvordan får jeg den til at opføre sig ordentligt? Det virkede for 3 sekunder siden og lige pludselig... Min umiddelbare fornemmelse er at der bliver skrevet et eller andet ekstra linie-skift ind....


Jeg har lavet en header med en struct:

struct hs_element {
  char name[15];
  int  score;
  int  colors;
  int  pins;
  int  max_guesses;
};


funktionen der starter det hele ser således ud:

void play_game(void) {

  int        m=0, p=0, i=0, guesses_used=0, points=0;   
  outcome    guess;
  char        code_array[N_DEF+1];
  struct hs_element  hs_member;

  for (i=0; i<N_DEF; i++)    /* Array initialiseres */ 
    code_array[i] = ' ';

  srand(time(NULL));   
  set_options(&m,&p); 

  generate_computer_code(code_array,m); 
 
  do guess = evaluate_guess(code_array,p,&guesses_used); 
  while (guess == proceed);

  switch (guess){
    case win:
      prn_win();
      points = (N_DEF * m * (20-guesses_used) + (21-p)); 
      if (check_for_hs_placement(points) == 1) {        /* Der tjekkes om spilleren kommer på highscore */
        hs_member = make_hs_member_struct(m,p,points);  /* Der laves en struct med oplysninger til highscore */
        write_to_highscore(&hs_member);                  /* structen skrives til highscore-fil */
      }




De 2 vigtige funktioner (tror jeg):

struct hs_element make_hs_member_struct(int m, int p, int points) { 

  struct hs_element hs_member;
  int i=0;
  char c;
 
  printf("Please write your firstname for the highscore: ");  /* spillerens navn indlæses */
  if (c = getchar() == '\n');  /* Denne linie "snupper" et ENTER der "hænger". Nødløsning(virker) */

  for (i=0; i<15; i++){        /* Array tømmes */
    hs_member.name[i] = ' ';
  }
   
  for (i=0; ((c = getchar()) != '\n'); i++)  /* indlæser navnet i struct.name */
    hs_member.name[i] = c;
  hs_member.score      = points;
  hs_member.colors      = m;
  hs_member.pins        = N_DEF;
  hs_member.max_guesses = p;
 
  return hs_member;
}


void write_to_highscore(struct hs_element *hs_member_pnt) {

  FILE *fp;
  struct hs_element tmp, hs_list[10]; /* array af structs */
  int i=0, j=0, max=0;
  char c;

  tmp = *hs_member_pnt;
  printf("tmp.navn er:%s!!!", tmp.name);

  max = get_pos_in_hs();
  fp = fopen("Highscore_file.txt","r");  /* Vi åbner først filen til læsning */

  if (max != 0){ 
    for (i=0; i<max; i++){  /* vi indlæser den eksisterende hs-liste  */
      fscanf(fp,"%[^,],%d,%d,%d,%d,%c",hs_list[i].name,&hs_list[i].score,&hs_list[i].colors,&hs_list[i].pins,&hs_list[i].max_guesses,&c);
    }
    for (i=0; i<max; i++){ 
      if (tmp.score > hs_list[i].score){
        j = i; 
        i = max;
        while (i>j) {  /* vi rykker lavere score's ned af highscore listen. Bemærk - gøres baglæns. */
          hs_list[i] = hs_list[i-1];
          --i;
        }
        hs_list[j] = tmp; /* indsætter den nye highscore placering. */
        break;
      } 
    }
  }
  else {
    hs_list[i] = tmp;
  }
  fclose(fp);

  fp = fopen("Highscore_file.txt","w"); /* Vi åbner nu filen til (over-)skrivning */
  for (i=0; i<=max; i++) {
    fprintf(fp, "%s,", hs_list[i].name);
    fprintf(fp, "%d,", hs_list[i].score);
    fprintf(fp, "%d,", hs_list[i].colors);
    fprintf(fp, "%d,", hs_list[i].pins);
    fprintf(fp, "%d,", hs_list[i].max_guesses);
    fprintf(fp, "\n");
  }
  fclose(fp);
}
Avatar billede arne_v Ekspert
24. maj 2004 - 07:16 #1
for (i=0; i<15; i++){        /* Array tømmes */
    hs_member.name[i] = ' ';
  }

børe være:

  for (i=0; i<15; i++){        /* Array tømmes */
    hs_member.name[i] = '\0';
  }

eller

memset(hs_member.name,'\0',15);
Avatar billede 2c Nybegynder
24. maj 2004 - 08:20 #2
Eller:

hs_member.name[i] = 0;
Avatar billede 2c Nybegynder
24. maj 2004 - 08:21 #3
Altså:

for (i=0; i<15; i++){        /* Array tømmes */
    hs_member.name[i] = 0;
  }
Avatar billede ulja03 Nybegynder
24. maj 2004 - 20:07 #4
Har fået håret farvet og prøvet flere ting. Det spiller nu. Jeg har blandt andet benyttet din hjælp arne_v, så lige bare et svar ind.
Avatar billede arne_v Ekspert
24. maj 2004 - 20:11 #5
svar
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester