Eine Liste erstellen



  • Hallo!

    Ich bin dabei ein kleines Hangman Programm zu schreiben.

    Bisher funktioniert es auch ganz gut. Hier erst mal der Quellcode:

    #include "stdafx.h"
    #include <stdio.h>
    #include <string.h>
    
    int main(int argc, char *argv[])
    {
        char solution[] = "Sommer";   /* gesuchtes Loesungswort */
        char guess[] = "______";      /* Zwischenloesung */
        char w;                     /* Eingegebenes Wort der Konsole */
        int exit = 0;               /* exit = 1: While Schleife wird verlassen */
        int i,j;                    /* Laufvariablen */
    
        /* Spielbeschreibung */    
        printf("Herzlich Willkommen bei Hangman!\n");
        printf("Geben Sie nach und nach einen Buchstaben ein, um das Wort zu erraten.\n");
        printf("Wenn sie das Spiel beenden moechten, geben Sie \"=\" ein.\n");
        printf("Los gehts:\n");    
        /* ---------------- */
    
        while(exit == 0){
            w = getchar();
            if (w == '=') exit = 1;      /* '=' eingeben um Spiel zu beenden */
    
            /* Ueberprueft, ob eingegebenes Wort im Loesungswort enthalten ist */
            for(i=0; i<6; i++){
               if(solution[i] == w){
                  guess[i] = w;
               }                                       
            }
    
            /* Gibt die bisher gefundenen Buchstaben aus */
            for(j=0; j<6; j++){             
               printf("%c ", guess[j]);
            }
    
            if(memcmp(solution, guess, sizeof(solution)) == 0 ){
               printf("\n Herzlichen Glueckwunsch, Sie haben das gesuchte Wort erraten.\n");
               exit = 1;
            } 
            printf("\n");
    
        }
    
        return 1;
    }
    

    Ich möchte aber gerne das Lösungswort nicht statisch einbinden. Soll heißen, dass es eine Liste mit verschiedenen Lösungswörtern geben soll, die per random ausgewählt werden. Ich habe aber keine Idee, wie ich das realisieren kann.

    Ausserdem habe ich noch das Problem, dass man eine Ausgaben immer direkt 2 mal erfolgen, weiss jemand warum?
    Wenn ich beispielsweise ein S eingebe, bekomme ich als Ausgabe
    S _ _ _ _ _
    S _ _ _ _ _

    Danke schon mal im Voraus



  • Sassylicious schrieb:

    #include "stdafx.h"
    #include <stdio.h>
    #include <string.h>
    
    int main(int argc, char *argv[])
    {
        char solution[] = "Sommer";   /* gesuchtes Loesungswort */
        char guess[] = "______";      /* Zwischenloesung */
        char w;                     /* Eingegebenes Wort der Konsole */
        int exit = 0;               /* exit = 1: While Schleife wird verlassen */
        int i,j;                    /* Laufvariablen */
        
        /* Spielbeschreibung */    
        printf("Herzlich Willkommen bei Hangman!\n");
        printf("Geben Sie nach und nach einen Buchstaben ein, um das Wort zu erraten.\n");
        printf("Wenn sie das Spiel beenden moechten, geben Sie \"=\" ein.\n");
        printf("Los gehts:\n");    
        /* ---------------- */
        
        while(exit == 0){
            w = getchar();
            if (w == '=') exit = 1;      /* '=' eingeben um Spiel zu beenden */
            
            /* Ueberprueft, ob eingegebenes Wort im Loesungswort enthalten ist */
            for(i=0; i<6; i++){
               if(solution[i] == w){
                  guess[i] = w;
               }                                       
            }
            
            /* Gibt die bisher gefundenen Buchstaben aus */
            for(j=0; j<6; j++){             
               printf("%c ", guess[j]);
            }
          
            if(memcmp(solution, guess, sizeof(solution)) == 0 ){
               printf("\n Herzlichen Glueckwunsch, Sie haben das gesuchte Wort erraten.\n");
               exit = 1;
            } 
            printf("\n");
            
        }
       
        
        return 1;
    }
    


  • Also deine Ausgabe erfolgt zweimal, weil die

    while(exit == 0){
       ...
    }
    

    -Schleife zweimal durchlaufen wird, einmal für das eingegebene Zeichen und einmal für \n. Hierzu gibt es gerade einen aktuelle Frage, guckst Du hier
    http://www.c-plusplus.net/forum/viewtopic-var-t-is-217581.html

    Ansonsten lege halt zum Anfang mal eine Datei an mit mehreren Wörtern, und lese diese dann in ein Array ein. Zuerst vielleicht eine bekannte Anzahl Wörter mit gleicher Länge (-> char array[x][y]), damit du keiner Speicher dynamisch allokieren musst, später kannst Du die Schwierigkeitsstufe ja steigern 🙂
    Achja, und dann mit rand() einen Index erstellen lassen mit dem Du in das Array langst.



  • Hi!

    Kann man sicher noch besser machen, aber funktionieren tut es mal.
    Wie man Wörter hinzufügt, sollte ersichtlich sein.
    Um das freigeben des Arrays habe ich mich jetzt aber nicht mehr gekümmert, sollte man aber, ich glaube deshalb funktioniert mehrmaliges hintereinander ausführen nicht. Compilieren - starten funktioniert. Compilieren - starten -starten funktioniert nicht.

    #include "stdafx.h"
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <time.h>
    
    #define MAXNUMBEROFSTRINGS 4
    int NumberOfStrings=0;
    
    void addstring(char** Array, const char* String)
    {	
    	Array[NumberOfStrings]=(char*)malloc(strlen(String));
    	strcpy(Array[NumberOfStrings],String);
    	NumberOfStrings++;
    }
    
    int main(int argc, char *argv[])
    {	
    	char* solution; //   	/* gesuchtes Loesungswort */
        char* guess;      	/* Zwischenloesung */
        char w;           	/* Eingegebenes Wort der Konsole */
        int exit = 0;       /* exit = 1: While Schleife wird verlassen */
        int i,j;  			/* Laufvariablen */
    	int r; 				/*random*/
    
      srand(time(NULL)); /*start randomize*/
    
      char** StringArray= (char**) malloc(MAXNUMBEROFSTRINGS);
      addstring(StringArray,"Winter");
      addstring(StringArray,"Herbst");
      addstring(StringArray,"Sommer");
      addstring(StringArray,"Fruehling");
    
      /*choose randomized  string*/
      r= rand()%NumberOfStrings;
      solution = StringArray[r];
    
      /*initialize guess*/
      if ((guess = (char*)malloc(strlen(solution))) == NULL) {
        puts("Memory allocation error!");
        return 0;
      }
      else
      {
    	for(i=0; i<(strlen(solution)); i++) guess[i] = '_'; 
      }
    
        /* Spielbeschreibung */    
        printf("Herzlich Willkommen bei Hangman!\n");
        printf("Geben Sie nach und nach einen Buchstaben ein, um das Wort zu erraten.\n");
        printf("Wenn sie das Spiel beenden moechten, geben Sie \"=\" ein.\n");
        printf("Los gehts:\n");    
        /* ---------------- */
    
        while(exit == 0){
            w = getchar();
    		fflush(stdin); /*clear input buffer*/
            if (w == '=') 
    		{
    			exit = 1;      /* '=' eingeben um Spiel zu beenden */
    			free(guess);   /*Speicher leeren*/
    		}
    		else
    		{
    	        /* Ueberprueft, ob eingegebenes Wort im Loesungswort enthalten ist */
    	        for(i=0; i<strlen(solution); i++){
    	           if(solution[i] == w){
    	              guess[i] = w;
    	           }                                      
    	        }
    
    	        /* Gibt die bisher gefundenen Buchstaben aus */
    	        printf("%s", guess);
    	        if(strcmp(solution, guess) == 0 ){
    	           printf("\n Herzlichen Glueckwunsch, Sie haben das gesuchte Wort erraten.\n");
    			   free(guess);
    	           exit = 1;
    	        }
    	        printf("\n");
           }
        }
        return 1;
    }
    

    Lg THE_ONE



  • Danke schonmal, er gibt es nun nicht mehr zweimal aus.
    Der Code von THE_ONE läuft bei mir allerdings nicht.

    Jetzt brauch ich noch eine Liste. Ist Addstring ANSI C?



  • Was geht denn nicht?? compilieren, ausführen, bekommst du Fehlermeldungen ???

    addstring ist eine Funktion die ich selber geschrieben habe, sieht man aber anhand des Quellcodes!

    Lg THE_ONE

    Ps.: Vielleicht hast du es nicht bemerkt, aber wenn du weitere Strings hinzufügen möchtest musst du auch hier:

    #define MAXNUMBEROFSTRINGS 10
    

    den Wert erhöhen. 😉



  • Hallo!

    Hab den Code nun verbessert und auch den Fehler gefunden, hab außerdem das Freigeben des Arrays eingebaut. Nun sollte alles Funktionieren.

    #include "stdafx.h"
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <time.h>
    
    #define MAXNUMBEROFSTRINGS 4
    int NumberOfStrings=0;
    
    void addstring(char** Array, const char* String)
    {	
    	Array[NumberOfStrings]=(char*)malloc(strlen(String));
    	strcpy(Array[NumberOfStrings],String);
    	NumberOfStrings++;
    }
    
    void FreeArray(char** StringArray)
    {
      int i;
      for(i=0;i<MAXNUMBEROFSTRINGS;i++)
        free(StringArray[i]);
      free(StringArray);
    }
    
    int main(int argc, char *argv[])
    {	
    	char* solution;		/* gesuchtes Loesungswort */
        char* guess;		/* Zwischenloesung */
        char w;				/* Eingegebenes Wort der Konsole */
        int exit = 0;		/* exit = 1: While Schleife wird verlassen */
        int i,j;			/* Laufvariablen */
    	int r;				/*random*/
    
      srand(time(NULL)); /*start randomize*/
    
      char** StringArray= (char**) malloc(MAXNUMBEROFSTRINGS*sizeof(char*));
      /*add Strings here - if you add a String here,change MAXNUMBEROFSTRINGS too*/
      addstring(StringArray,"Winter");
      addstring(StringArray,"Herbst");
      addstring(StringArray,"Sommer");
      addstring(StringArray,"Fruehling");
    
      /*choose randomized  string*/
      r= rand()%NumberOfStrings;
      solution = StringArray[r];
    
      /*initialize guess*/
      if ((guess = (char*)malloc(strlen(solution))) == NULL) {
        puts("Memory allocation error!");
        return 0;
      }
      else
      {
    	for(i=0; i<(strlen(solution)); i++) guess[i] = '_'; 
      }
        /* Spielbeschreibung */    
        printf("Herzlich Willkommen bei Hangman!\n");
        printf("Geben Sie nach und nach einen Buchstaben ein, um das Wort zu erraten.\n");
        printf("Wenn sie das Spiel beenden moechten, geben Sie \"=\" ein.\n");
        printf("Los gehts:\n");    
        /* ---------------- */
    
        while(exit == 0){
            w = getchar();
    		fflush(stdin); 
            if (w == '=') 
    		{
    			exit = 1;      /* '=' eingeben um Spiel zu beenden */
    			free(guess);   /*Speicher leeren*/
    			FreeArray(StringArray);
    		}
    		else
    		{
    	        /* Ueberprueft, ob eingegebenes Wort im Loesungswort enthalten ist */
    	        for(i=0; i<strlen(solution); i++){
    	           if(solution[i] == w){
    	              guess[i] = w;
    	           }                                      
    	        }
    	        /* Gibt die bisher gefundenen Buchstaben aus */
    	        printf("%s", guess);
    	        if(strcmp(solution, guess) == 0 ){
    	           printf("\n Herzlichen Glueckwunsch, Sie haben das gesuchte Wort erraten.\n");
    			   free(guess);
    			   FreeArray(StringArray);
    	           exit = 1;
    	        }
    	        printf("\n");
           }
        }
        return 1;
    }
    

    Lg THE_ONE



  • OKe soweit läuft es erstmal.

    ABER: Bei dieser Funktion von THE_ONE beendet er nicht nach dem das Lösungswort komplett eingegeben wurde.

    if(strcmp(solution, guess) == 0 ){
                   printf("\n Herzlichen Glueckwunsch, Sie haben das gesuchte Wort erraten.\n");
                   free(guess);
                   FreeArray(StringArray);
                   exit = 1;
                }
    

    Und bei meiner Funktion bricht er die Eingabe ab, bevor alle Buchstaben eingegeben wurden, meist nach der 4. Eingabe.

    if(memcmp(solution, guess, sizeof(solution)) == 0 ){
               printf("\n Herzlichen Glueckwunsch, Sie haben das gesuchte Wort erraten.\n");
               exit = 1;
            }
    

    Der ganze Quellcode sieht nun so aus:

    #include "stdafx.h"
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <time.h>
    
    #define MAXNUMBEROFSTRINGS 4
    int NumberOfStrings=0;
    
    void addstring(char** Array, const char* String)
    {   
        Array[NumberOfStrings]=(char*)malloc(strlen(String));
        strcpy(Array[NumberOfStrings],String);
        NumberOfStrings++;
    }
    void drain_stdin (void)
    {
      int c;
      do
      {
        c = fgetc(stdin);
      } while (c != EOF && c != '\n');
    }
    
    void freeArray(char** StringArray)
    {
      int i;
      for(i=0;i<MAXNUMBEROFSTRINGS;i++)
        free(StringArray[i]);
        free(StringArray);
    }
    
    int main(int argc, char *argv[])
    {   
        char* solution;        /* gesuchtes Loesungswort */
        char* guess;           /* Zwischenloesung */
        char w;                /* Eingegebenes Wort der Konsole */
        int exit = 0;          /* exit = 1: While Schleife wird verlassen */
        int i,j;               /* Laufvariablen */
        int r;                 /*random*/
    
      srand(time(NULL)); /*start randomize*/
    
      char** StringArray= (char**) malloc(MAXNUMBEROFSTRINGS*sizeof(char*));
      /*add Strings here - if you add a String here,change MAXNUMBEROFSTRINGS too*/
      addstring(StringArray,"Winter");
      addstring(StringArray,"Herbst");
      addstring(StringArray,"Sommer");
      addstring(StringArray,"Fruehling");
    
      /*choose randomized  string*/
      r = rand()%NumberOfStrings;
      solution = StringArray[r];
    
      /*initialize guess*/
      if ((guess = (char*)malloc(strlen(solution))) == NULL) {
        puts("Memory allocation error!");
        return 0;
      }
      else
      {
        for(i=0; i<(strlen(solution)); i++) guess[i] = '_';
      }
        /* Spielbeschreibung */    
        printf("Herzlich Willkommen bei Hangman!\n");
        printf("Geben Sie nach und nach einen Buchstaben ein, um das Wort zu erraten.\n");
        printf("Wenn sie das Spiel beenden moechten, geben Sie \"=\" ein.\n");
        printf("Los gehts:\n");    
        /* ---------------- */
    
      while(exit == 0){
    		w = getchar();
    		// fflush(stdin); 
    		drain_stdin(); 
    
            if (w == '=')
            {
                exit = 1;      /* '=' eingeben um Spiel zu beenden */
                free(guess);   /*Speicher leeren*/
                freeArray(StringArray);
            }
    		else {
    			/* Ueberprueft, ob eingegebenes Wort im Loesungswort enthalten ist */
    			for(i=0; i<strlen(solution); i++){
    				if(solution[i] == w){
    					guess[i] = w;
    				}                                       
    			}
    
    			/* Gibt bisherige Loesung aus */
    			for(j=0; j<strlen(solution); j++){             
    				printf("%c ", guess[j]);	
    			}
    
    			/* Ueberprueft ob Loesungswort = bisherige Loesung */
    			if(memcmp(solution, guess, sizeof(solution)) == 0 ){
                    printf("\n Herzlichen Glueckwunsch, Sie haben das gesuchte Wort erraten.\n");
                    free(guess);
                    freeArray(StringArray);
                   exit = 1;
                }
    
    			printf("\n");
    		}
        }
        return 1;
    }
    


  • Hi!

    Also wenn du meine CODE 1:1 genommen hast dann müsste es funktionieren, aber egal.

    Dein Code ist ja eigentlich genau gleich wie meiner nur mit ein paar kleinen Änderungen und genau die bewirken dass das Programm nach ein paar Eingaben abricht.

    Hab mir deinen Code angesehen, der Fehler ist hier gelegen (verstehe aber nicht warum das strcmp nicht funktionieren sollte):

    if(memcmp(solution, guess, strlen(solution)) == 0 ){
                    printf("\n Herzlichen Glueckwunsch, Sie haben das gesuchte Wort erraten.\n");
                    free(guess);
                    freeArray(StringArray);
                   exit = 1;
                }
    

    Lg THE_ONE



  • Warum hast du dir eine eigen Funktion drain_stdin geschrieben?? Für was ist die gut, bzw was kann die mehr als fflush(stdin)

    Lg THE_ONE



  • Hallo,

    zu drain_stdin siehe http://www.c-plusplus.net/forum/viewtopic-var-t-is-217581.html

    Warum hast du dir eine eigen Funktion drain_stdin geschrieben?? Für was ist die gut, bzw was kann die mehr als fflush(stdin)

    Deswegen: http://c-faq.com/stdio/stdinflush.html

    MfG,

    Probe-Nutzer



  • Wenn ich deinen Code 1:1 übernehme, bekomme ich eben nicht die Message aus Zeile 83:

    if(strcmp(solution, guess) == 0 ){
                   printf("\n Herzlichen Glueckwunsch, Sie haben das gesuchte Wort erraten.\n");
                   free(guess);
    

    Wenn fflush(stdin) drin ist, hab ich nach der Ausgabe des Zwischenergebnisses so komische Zeichen:
    http://www.mitglied.lycos.de/firstLadies1/images/ffstdin.jpg

    Außerdem bringt es mir ja nichts, deinen Code 1:1 zu übernehmen *g*



  • Keiner eine Idee?



  • Siehe Zeile 9
    ----------------------

    /*initialize guess*/
      if ((guess = (char*)malloc(strlen(solution))) == NULL) {
        puts("Memory allocation error!");
        return 0;
      }
      else
      {
        for(i=0; i<(strlen(solution)); i++) guess[i] = '_';
    	guess[strlen(solution)] = '\0';
      }
    


  • Das funktioniert soweit.
    Nun hab ich noch einen Fehler, wenn er das Programm beendet, beim freigeben des Speichers.

    "Debug Error

    HEAP CORRUPTION DETECTED: after Normal Block (#60) at 0x000D31E0.
    CRT detected that the application wrote to memory after the end of heap buffer."

    Weiss jemand was ich falsch mach?



  • Hi!

    Ich weiß nicht an was es liegen könnte da es bei mir funktioniert. Das Bild von dir ist super, jetzt weiß ich was du meinst, leider bekomme ich den Fehler selbst nie. Das mit:

    guess[strlen(solution)] = '\0';
    

    ist aber eine gute Idee und bewirkt in deinem Fall Wunder, nur eigentlich müsste an dieser Stelle schon diese Zeichen stehen. Tuts bei mir auch.
    Daher kann ich auch zu deinem Heap Problem nichts sagen, da das bei mir auch funktioniert.
    Ich hab hier mal mein Hangman.exe (compiliert mit DMC unter WinXP Pro 32bit) hochgeladen, probier das mal aus und sag mir ob es Fehler wirft? Vielleicht kannst du mir auch dein Hangman.exe hochladen, dann kann ich schauen ob es bei mir funktioniert.

    Lg THE_ONE

    hangman.exe: http://rapidshare.com/files/129558232/hangman.exe



  • Seit ich

    guess[strlen(solution)] = '\0';
    

    drin habe, kommen diese komischen Zeichen aus meinem Bild nicht mehr 😃

    Aber komisch das du keinen Heapfehler bekommst 😕



  • Irgendwie fehlt bei dir das EndOfString und mit der eine Zeile bewirkst du genau das, verstehe aber nicht warum bei dir das EndOfString überhaupt fehlt 😕

    Hast du meine exe ausprobiert, funktioniert sie oder bekommst du den gleichen Fehler (Heap Fehler) wieder??

    Lg THE_ONE



  • Also bei dir gehts. Kannst mir deinen Code noch mal posten, damit ich schauen kann, wo der Unterschied ist?



  • So hier nochmal der Code:

    #include "stdafx.h"
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <time.h>
    
    #define MAXNUMBEROFSTRINGS 4
    int NumberOfStrings=0;
    
    void drain_stdin (void)
    {
      int c;
      do
      {
        c = fgetc(stdin);
      } while (c != EOF && c != '\n');
    } 
    
    void addstring(char** Array, const char* String)
    {	
    	Array[NumberOfStrings]=(char*)malloc(1+strlen(String));
    	strcpy(Array[NumberOfStrings],String);
    	NumberOfStrings++;
    }
    
    void FreeArray(char** StringArray)
    {
      int i;
      for(i=0;i<MAXNUMBEROFSTRINGS;i++)
      {
        free(StringArray[i]);
      }
      free(StringArray);
    }
    
    int main(int argc, char *argv[])
    {	
    	char* solution;		/* gesuchtes Loesungswort */
        char* guess;		/* Zwischenloesung */
        char w;				/* Eingegebenes Wort der Konsole */
        int exit = 0;		/* exit = 1: While Schleife wird verlassen */
        int i,j;			/* Laufvariablen */
    	int r;				/*random*/
    
      srand(time(NULL)); /*start randomize*/
    
      char** StringArray= (char**) malloc(MAXNUMBEROFSTRINGS*sizeof(char*));
      /*add Strings here - if you add a String here,change the MAXNUMBEROFSTRINGS too*/
      addstring(StringArray,"Winter");
      addstring(StringArray,"Herbst");
      addstring(StringArray,"Sommer");
      addstring(StringArray,"Fruehling");
    
      /*choose randomized  string*/
      r= rand()%NumberOfStrings;
      solution = StringArray[r];
    
      /*initialize guess*/
      if ((guess = (char*)malloc(1+strlen(solution))) == NULL) {
        puts("Memory allocation error!");
        return 0;
      }
      else
      {
    	for(i=0; i<(strlen(solution)); i++) guess[i] = '_'; 
    	guess[strlen(solution)] = '\0';
      }
        /* Spielbeschreibung */    
        printf("Herzlich Willkommen bei Hangman!\n");
        printf("Geben Sie nach und nach einen Buchstaben ein, um das Wort zu erraten.\n");
        printf("Wenn sie das Spiel beenden moechten, geben Sie \"=\" ein.\n");
        printf("Los gehts:\n");    
        /* ---------------- */
    
        while(exit == 0){
            w = getchar();
    		drain_stdin(); 
            if (w == '=') 
    		{
    			exit = 1;      /* '=' eingeben um Spiel zu beenden */
    			free(guess);   /*Speicher leeren*/
    			FreeArray(StringArray);
    		}
    		else
    		{
    	        /* Ueberprueft, ob eingegebenes Wort im Loesungswort enthalten ist */
    	        for(i=0; i<strlen(solution); i++){
    	           if(solution[i] == w){
    	              guess[i] = w;
    	           }                                      
    	        }
    
    	       	/* Gibt bisherige Loesung aus */
    			 /*printf("%s", guess);*/
    			for(j=0; j<strlen(solution); j++){            
                    printf("%c ", guess[j]);   
                } 
    
    	        if(strcmp(solution, guess) == 0 ){
    	           printf("\n Herzlichen Glueckwunsch, Sie haben das gesuchte Wort erraten.\n");
    			   free(guess);
    			   FreeArray(StringArray);
    	           exit = 1;
    	        }
    	        printf("\n");
           }
        }
        return 1;
    }
    

    Lg THE_ONE


Anmelden zum Antworten