String teilen
-
Hallo
ich bin dabei mit 2 leuten ein Spiel zu programmieren... wir wollen auch ne highscoreliste einbauen... die soll dann als text-datei abgespeichert werden...
das speicher klappt auch... ich habe es auch geschafft die einzelnen zeilen der datei in strings zu lesen... jetzt muss ich aber irgendwie die strings teilen, da ich die liste neu sortieren will, wenn ein neuer name dazu kommt...
die liste sieht ungefähr so aus:
1. User1 1
2. User2 5
3. User3 10
.
.
.
10. User10 35ich will jetzt also die usernamen in einem array haben und die ergebinisse in einem array...
aber da ich die liste mit dem mergesort sortiere, müssen usernamen und ergebnisse mit einander verbunden werden, damit auch hinterher die richtige reihenfoleg dasteht... also hatte ich an eine matrix gedacht...
problem is nur, dass die ergebnisse als integer vorliegen müssen um sortiert zu werden... die usernamen sind aber ein charakter array... wir kriege ich das unter einen hut?
bitte helft mir!
-
Was auch immer du sortierst, du vergleichst 2 Elemente miteinander und entscheidest, welches kleiner ist.
Bei Zahlen machst du das mit <.Bei Strings nimmst du stattdessen strcoll oder strcmp.
-
Sandmanzz schrieb:
Hallo
problem is nur, dass die ergebnisse als integer vorliegen müssen um sortiert zu werden... die usernamen sind aber ein charakter array... wir kriege ich das unter einen hut?Nutze die Macht der Strukturen.
tt
-
Und zusätzlich die Macht von sscanf().
-
gibt es denn keine funktion mit der ich einen teilstring aus einen string ermitteln kann indem ich anfangs und endpunkt angeben?
und wenn nicht, wie kann ich sowas schreiben?
-
strncpy() wäre eine Möglichkeit. (aber, wie die Kollegen schon sagten, zerteile dir deinen String lieber per sscanf() - das ist einfacher)
-
char platz[10][24], *user[10][2]; char helpusername[10][11], helpuserversuche[10][6]; /* ANFANG user-String wird geschrieben */ /* Usernamen werden in das String-Array *user geschrieben */ for(j = 0; j < 10; j++){ for(i = 0; i < 10; i++){ sprintf(&helpusername[j][i], "%c", platz[j][i + (USERNAME_ANFANG - 1)]); } sscanf(helpusername[j], "%s", &user[j][0]); } /* Versuche werden in das String-Array *user geschrieben */ for(j = 0; j < 10; j++){ for(i = 0; i < 5; i++){ sprintf(&helpuserversuche[j][i], "%c", platz[j][i + (VERSUCHE_ANFANG - 1)]); } sscanf(helpuserversuche[j], "%s", &user[j][1]); } /* ENDE user-String wird geschrieben */
ich will helusername und helpuserversuche in die Matrix *user copieren.... mit den versuchen klappt das, aber mit den namen nicht und ich weiß nicht warum...
in der Matrix platz[][] stehen übrigens die kompletten zeilen aus eminer highscore.txt
USERNAME_ANFANG und VERSUCHE_ANFANG sind die anfangsstellen in den zeilen... username ist 10 zeichen lang und Versuch 5 zeichen lang
-
ich nochmal...
ich habe mit helpusername, helpuserversuche, user[][0] und user[][1] mit printf zeigen lassen... helpusername und helpuserversuche sind korrekt... user[][1] auch... aber user[][0] nicht... und da sollen ja die namen drin sein
-
Erstens ist bei der Deklaration ein * zu viel - du legst ein Array von 10*2 char-Pointern an (die übrigens nicht initialisiert sind).
Zweitens solltest du Platzierung und Name besser zu einem struct zusammenfassen:
typedef struct { char name[11];// 10 Zeichen und '\0' int versuche; }spieler; spieler s; char zeile[24]="1. Spieler 1 5"; sscanf(zeile,"%*3c%10c%d",s.name,&(s.versuche)); // %*3c - Platz (wird verworfen), %10c - Name, %d - Versuche
Und drittens: Blickst du bei deiner Pointer-Rechnerei überhaupt noch selber durch?
-
aber wir gebe ich den die strukturen in den mergesort?
mit der matrix wäre das einfach... und dann wären die namen und versuche auch direkt verbunden...
char *user[10][2] --> ich dachte ich krieg damit eine matrix mit 20 felder in die ich strings schreiben kann
-
Sandmanzz schrieb:
aber wir gebe ich den die strukturen in den mergesort?
Indem du ein Array von struct's sortierst (dazu benötigst du vermutlich (ähm, ziemlich sicher) eine eigene Vergleichsfunktion)
mit der matrix wäre das einfach... und dann wären die namen und versuche auch direkt verbunden...
Ja, am Anfang schon - aber beim Sortieren mußt du höllisch aufpassen, daß sie auch immer zusammenbleiben.
char *user[10][2] --> ich dachte ich krieg damit eine matrix mit 20 felder in die ich strings schreiben kann
Damit bekommst du erst einmal 20 nicht initialisierte char-Pointer - die du anschließend noch auf entsprechend große Speicherbereiche umbiegen mußt (z.B. eine char[]-Variable deines Hauptprogramms oder ein mit malloc() angeforderter Bereich).
PS: Wenn du in ein vorsortiertes Feld etwas einsortieren willst, ist vermutlich InsertSort günstiger.
-
also das mit der struktur klappt soweit....
muss jetzt nur noch schaun ob das mit meinem mergesort auch hinhaut...
danke schonmal
-
da ich gerade nichts besseres zu tun habe, zeige ich dir mal wie man die macht der strukturen in kombination mit der macht von scanf nutzt:
#include <stdio.h> #include <string.h> #define HIGHSCORE_SIZE 10 #define HIGHSCORE_FILENAME "highscore.txt" struct highscore_entry { int score; char name[9]; }; struct highscore_entry highscore[HIGHSCORE_SIZE]; void init_highscore (void) { int i; for(i=0; i<HIGHSCORE_SIZE; ++i) { highscore[i].score=0; strcpy(highscore[i].name,"---"); } } int add_highscore (int score, char *name) { int i,j; for(i=0; i<HIGHSCORE_SIZE; ++i) if(score>=highscore[i].score) break; if(i==HIGHSCORE_SIZE) return 0; /* score wasnt added */ for(j=HIGHSCORE_SIZE-1; j<i; --j) { highscore[j].score=highscore[j-1].score; strcpy(highscore[j].name,highscore[j-1].name); } highscore[i].score=score; strcpy(highscore[i].name,name); return 1; /* score was added to highscore table */ } void load_highscore (void) { FILE *fp; int i; init_highscore(); fp=fopen(HIGHSCORE_FILENAME,"r"); if(fp) { for(i=0; i<HIGHSCORE_SIZE; ++i) fscanf(fp,"%d %8[^/n]/n",&highscore[i].score,highscore[i].name); fclose(fp); } } void save_highscore (void) { FILE *fp; int i; fp=fopen(HIGHSCORE_FILENAME,"w"); if(fp) { for(i=0; i<HIGHSCORE_SIZE; ++i) fprintf(fp,"%09d %[^/n]/n",highscore[i].score,highscore[i].name); fclose(fp); } } void print_highscore (void) { int i; for(i=0; i<HIGHSCORE_SIZE; ++i) printf("%02d. %09d %s\n",i+1,highscore[i].score,highscore[i].name); }
natürlich kannst du die highscore-tabelle auch einfach mit fwrite() binär speichern.