String Wert speichern

Hotte93

Grünschnabel
Hey Com,

ich versuche gerade das Spiel "Hangman" zu programmieren.
C#:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>

int main() {
   
   
char Wort     [200];
char z          [200];
char eingabe [200];
char w;
int i=0;
int j=0;
int x=0;



scanf("%s", Wort);

printf("Gesuchtes Wort : ");

for(i=0; i<strlen(Wort); i++){
   
    w='-';
   

printf("%c", w);
}



while(1){
   
       

   

    printf("\nGeben Sie einen Buchstaben ein : \n");     
    scanf("%s", &eingabe[0]);
   
   
        for(j=0; j<=strlen(Wort); j++){     //Buchstaben gegen '-' tauschen
       
        if(Wort[j] == eingabe[0]){
           
           
       
                z[0]=eingabe[0];
            }
       
       
                  else{
           
                z[0]= '-';
            }
           
               
                printf("%s", &z );       
           
}
}
           
           
        return 0;
}

Es funktioniert soweit das ich Worte einlesen kann und die Bindestriche durch den richtig eingegebenen Buchstaben ersetzte.
Jedoch bei einem weiteren durchlauf werden diese Buchstaben nicht gespeichert.
Weiss da jemand weiter?
 

cwriter

Erfahrenes Mitglied
Hi

Jedoch bei einem weiteren durchlauf werden diese Buchstaben nicht gespeichert.
Weiss da jemand weiter?
Gehen wir mal durch:
C++:
scanf("%s", Wort);

printf("Gesuchtes Wort : ");

for(i=0; i<strlen(Wort); i++){
 
    w='-';
 

printf("%c", w);
}
Das stimmt so. Auch wenn es schneller geht:
C++:
for(i=0; i<strlen(Wort); i++) printf("-");

In der nächsten Sektion solltest du wirklich auf die Formatierung achten, die ist so ja fast unlesbar. Ich habe es mal ein bisschen zurechtgerückt.
C++:
printf("\nGeben Sie einen Buchstaben ein : \n");
scanf("%s", &eingabe[0]); //Gehen wir durch:
/*
eingabe ist ein char[], was äquivalent zu char* ist.
eingabe[0] ist äquivalent zu *((char*)eingabe + 0), und das '&' davor sorgt für diesen Ausdruck:
((char*)eingabe + 0), was wiederum einfach nur eingabe ist.
entsprechend:
scanf("%s", eingabe); //Schon viel sauberer, oder?
Aber eigentlich willst du ja nur ein Zeichen lesen, oder?
Entsprechend würde es reichen eingabe als
char eingabe;
zu definieren und ein scanf("%c", &eingabe) zu machen. Die eingabe müsstest du dann entsprechend im Rest des Codes anpassen.
*/
for(j=0; j<=strlen(Wort); j++) {    //Buchstaben gegen '-' tauschen   
    /*
    strlen liefert die Anzahl Zeichen bis zum ersten '\0'. Durch das '<=' liest du also die '\0' mit, ohne einen Grund dafür zu haben. Weg damit. Schreibe '<' stattdessen
    */
    if(Wort[j] == eingabe[0]) {   //Wenn das Zeichen stimmt, schreibe es hin
          z[0]=eingabe[0]; //Warum z[0]? Willst du nicht die Stelle entsprechend übernehmen, also
          /*
          z[j] = eingabe; //Oder halt eingabe[0]
          */
    }
    else { //Sonst solltest du ja nichts machen, da du dann die bereits geschriebenen gefundenen Buchstaben überschreiben würdest.
        z[0]= '-'; //Weg damit
     }
     printf("%s", &z );        //Nö.
     //printf("%s", z);          //Ja.
        
}

Das while(1) solltest du irgendwann auch durch eine sinnvollere Bedingung (z.B. Anzahl Versuche übersteigt Maximum) ersetzen.

Zudem solltest du wohl im z-Buffer auch noch ein '\0' and den Index strlen(Wort) schreiben, um sicherzugehen, dass nie zuviel gelesen wird. Im Debugmode wirst du das nicht bemerken, aber im Releasemode steht in den Buffern bei Initialisierung normalerweise einfach irgendwas.

Gruss
cwriter

/EDIT: Generell wäre es wohl besser, wenn du am Anfang den String z mit '-' befüllen und mit '\0' terminieren würdest und dann einfach jedes mal die Buchstaben in z einfügst, wo sie hingehören (also einfach die '-' mit dem korrekten Buchstaben überschreiben).
 
Zuletzt bearbeitet: