Frage wegen einfachem Game!
-
Aha,ok
Werde die beiden ersetzen!Wie kann ich von einem String die Position eines Buchstabes erfahren?
Damit ich zb. die dritte Position im Wort MICHAEL anzeigen lassen kann, wenn eine if Bedingung beispielsweise zutrifft.
Also **C****???
Danke im voraus und für eure bisherigen Tips!
Ich weiß, ich greife zu weit vor mit diesen kleinen Spielereien, aber ich wollte das schon immer mal probieren und so schlecht mach ich mich nicht für den Anfang!
Bin ja ein richtiger Frischling in der Programmierwelt!
Soll aber nicht immer so bleiben!
-
Dann eine Frage habe ich noch!
In dem Textfile ist immer nur ein Wort mit mindestens 4 Zeichen!
Aber es kommt oft ein Wort mit 2 Zeichen, nämlich " ? a zum erraten, obwohl das nicht im Textfile steht!Woher kommt das?
Wie kann ich das entfernen, bzw. wo liegt der Fehler!Habe conio.h und getchar() entfernt!
DANKE IM VORAUS!
-
Lass dir mal deine Zufallszahl ausgeben dann kommst vll selbst auf den Fehler...
Auch würde es allgemein Sinn machen Variablen zu initialisieren und bei Funktionen den Rückgabewert auszuwerten.
-
Aja!
Habe das mit der Zufallszahl gecheckt!Und auf das mit den * bin ich auch gekommen!
Hab aber lange gebraucht um mit meinen Mitteln auf eine Lösung zu kommen!#include <string.h> #include <stdio.h> #include <string.h> #include <stdlib.h> int main(int argc,char *argv) { char string1[25]={"*******"}; char string2[25]={"michael"}; char eingabe; char *pointer; int lang1; int lang2; int langganz; printf("Raten Sie: "); scanf("%c",&eingabe); pointer=strrchr(string2,eingabe); if(pointer!=NULL) { lang1=strlen(pointer); lang2=strlen(string1); langganz=lang2-lang1; string1[langganz]=string2[langganz]; printf("%s\n",string1); } else{printf("Falsch\n");} system("PAUSE"); return 0; }
Jetzt gibts mir * aus, außer wenn ich das richtige eingeb!
Nur noch einbauen --> VOILA
-
Also:
Ich habe es eingebaut, aber ich habe zwei kleine Probleme!
Funktionieren tut es prinzipiell!
Wenn es zwei gleiche Buchstaben im Wort gibt, wie mache ich das?- Strrchr sucht ja immer nur nach letztem Vorkommen!
- Wenn ich ein Wort im Textfile habe, dass länger ist als 9 Zeichen spinnt es mir! Wieso? liegt es an der größe der Felder bzw. Strings?
Hier der Code:
#include <string.h> #include <stdlib.h> #include <stdio.h> #include <windows.h> #include <time.h> int main(int argc, char *argv) { srand(time(NULL)); char Text[600]; char Wort[25]; char alphabet[50]={}; char alphabet2[50]={}; char buchstabe; char zeichen[]={"*"}; char sterne[25]; char *pointer; char file_name[]={"C:\\Dokumente und Einstellungen\\akhtdrscm\\Desktop\\C\\Michael.txt"}; FILE *f; f=fopen(file_name,"r"); int zufall; zufall=rand()%7+1; int i; for(i=0; i<zufall;i++) { fgets(Text, sizeof(Text), f); } strcpy(Wort,Text); int lang; lang=strlen(Wort)-1; int d; for(d=0;d<lang;d++) {sterne[d]= zeichen[0];} printf("%s\n",sterne); int j; printf("Das Wort ist %d Zeichen lang\n",lang); for(j=1;j<9;j++) { printf("\nGib deinen Buchstaben ein: "); scanf("%c",&buchstabe); sprintf(alphabet,"%c",buchstabe); strcat(alphabet2,alphabet); if(strrchr(Wort,buchstabe)!=0) {printf("\nRichtig...ENTER DRUECKEN\n"); if(j>0){j=j-1; getchar();}} else if(strrchr(Wort,buchstabe)==0) {printf("\nFalsch...ENTER DRUECKEN\n"); getchar(); } getchar(); system("Cls"); pointer=strrchr(Wort,buchstabe); if(pointer!=NULL) { int lang2,langganz; lang2=strlen(pointer)-1; langganz=lang-lang2; sterne[langganz]=Wort[langganz]; printf("\n%s\n",sterne); } printf("Das Wort ist %d Zeichen lang\n",lang); printf("\n%s\n",alphabet2); printf("\n%s\n",sterne); switch(j) { case 1 : printf("\n< >\n"); break; case 2 : printf("\n |\n |\n |\n |\n< >\n"); break; case 3 : printf("\n ___\n |\n |\n |\n |\n< >\n"); break; case 4 : printf("\n ___\n | |\n |\n |\n |\n< >\n"); break; case 5 : printf("\n ___\n | |\n | ()\n |\n |\n< >\n"); break; case 6 : printf("\n ___\n | |\n | ()\n | []\n |\n< >\n"); break; case 7 : printf("\n ___\n | |\n | ()\n | -[]-\n |\n< >\n"); break; case 8 : printf("\n ___\n | |\n | ()\n | -[]-\n | ||\n< >\n"); break; } int win; int punkte=0; for (win=0;win<lang;win++) { if(sterne[win]==Wort[win]) {punkte++;} } if(punkte==lang) {printf("\nGEWONNEN!\n\nMit Enter bestaetigen\n"); system("PAUSE"); return 0;} } printf("\nDu wurdest aufgehaengt\n"); printf("\nDas Wort war: %s\n",Wort); system("PAUSE"); return 0; }
Hier das Textfile:
michael
alexander
programme
wissen
versuche
fehlstund
eselSobald ich ein e zu fehlstund mache, gibts probleme beim einlesen dieser Zeile!
DANKE IM VORAUS!
-
Zu Problem 1: Die Funktion liefert dir ja einen Pointer auf den letzten gefundenen Buchstaben( zB. suche nach 'm' in 'kommen' -> 'men').
Jetz kannst du die Information entwerder dazu nutzen um dir nen neuen String zu basteln ('kom') und strrchr so lange suchen lassen bis die Funktionen nen Null-Pointer liefert...
Oder du benutzt strchr (sucht das erste Vorkommen im String) und erhöhst den zurückgegebenen Pointer um eins um erneut strchr zu machen bis du Null zurückbekommst ('m' in 'kommen' -> 'mmen' -> ++ -> 'men'...). So sparst dir das Erstellen eines temporären Strings...Zu Problem 2: Kann ich grad auf die Schnelle nich erkennen...
EDIT: In welcher Zeile passiert denn der Fehler?
-
in Fehlstund bzw. immer wenn ich mehr als 9 Buchstaben habe!
-
Ich dachte eher in welcher Codezeile!
-
Also zuerst mal!
DANKE AN EUCH ALLE!
Jetzt gehts!
Ihr habt mir nicht den Code geschrieben, weil ich sonst nix lernen würde, aber tolle Tips gegeben!
Es funktioniert, ich füge einfach zwei Pointer ein und verknüpf sie mit bedingungen.
Wisst ihr woran es gehapert hat?
Ich wusste nicht, dass es auch strchr gibt, welches auf das erste zeigt!
In meinem dummen Tutorial, welches ich durchgehe steht nur strrchr!DANKE!
zu 2)
ich weiß nicht genau die Zeile!
Es geht darum, dass sobald ein Wort mehr als 9 Buchstaben hat, dann kommt mir nicht dieses ***** richtig raus, sondern *****snih3o42, also irgendwelche Zeichen danach!
Habe schon die Größe verändert der Felder, hat aber alles nur verschlechtert!
Werde nun einfach höchstens Wörter mit 9 Zeichen verwenden!DANKE!
-
weil du die variable sterne nicht initialisierst bzw kein Stringendezeichen nach deinen * einfügst...
-
So!
Das habe ich auch beseitigt!Nur noch ein einziges Problem!
Ich habe es geschafft eigentlich alles einzubauen, aber mein problem ist noch, dass ich nicht klarkomme damit, wenn es mehr als 2 gleiche buchstaben gibt, denn dann sucht er nur das erste und das letzte (wegen strchr & strrchr) und ersetzt die * durch die richtigen Buchstaben!
Ich hab alles probiert, aber diesmal komm ich nicht zurecht irgendwie!
Wie kann ich machen, dass er nach der ersten im übriggebliebenen nach weiteren solchen buchstaben sucht und immer so weiter, bis er nix findet. Dann ersetzt er gesamt alle richtigen positionen und setzt statt stern überall den buchstaben ein???Wie mache ich das?
Viele Wörter oder Sätze haben mehr als zwei gleiche Zeichen!Bitte diesmal mit Beispiel!
DANKE!
-
Ach ja, hier der Teil des Codes wie ich es derweil mache!
pointer=strrchr(Wort,buchstabe); if(pointer!=NULL) { int lang2,langganz; lang2=strlen(pointer)-1; langganz=lang-lang2; sterne[langganz]=Wort[langganz]; } pointer2=strchr(Wort,buchstabe); if(pointer2!=NULL && pointer2!=pointer) { int lang2,langganz; lang2=strlen(pointer2)-1; langganz=lang-lang2; sterne[langganz]=Wort[langganz]; } printf("\n%s\n",sterne);
-
Ich habs dir in meinem post eigentlich schon beschrieben, aber hier ein kleiner Codeschnipsel:
pointer = Wort; counter = 0; while((pointer = strchr(pointer,Buchstabe))) { counter++; // Zaehlt die Stelle im Wort, muss vor while natürlich mit 0 initialisiert werden pointer++; // Naechster Buchstabe, denn den jetzigen haben wir schon gefunden // Sterne setzen etc..... }
So und in der Schleife kannst du nun deine Buchstaben und Sterne setzten, dank counter weißt du an welcher Stelle deiner Arrays..
Ich denke das sollte helfen
-
Soweit ich verstanden habe, was du erreichen willst, würde ich dies so machen:
pointer = strchr(Wort,buchstabe); while( pointer ) { sterne[pointer-Wort] = *pointer; pointer = strchr(pointer+1, buchstabe); }
-
Danke euch beiden!
Besonders Wutz´s Beitrag war sehr verblüffend, aber ich habe schon mitbekommen, dass du das professionell machst!Eine kurze Fragen, wenn es keine Umstände macht:
Könntest du mir erklären was du ungefähr gemacht hast da in diesen paar Zeilen!
Bin irgendwie verwirrt!
-
/* setze Zeiger auf 1.Vorkommen von <buchstabe> in <Wort> */ pointer = strchr(Wort,buchstabe); /* wenn Position vorhanden... */ while( pointer ) { /* pointer zeigt hier auf Position des gefundenen Buchstaben ermittle den Abstand der Position vom Beginn des Strings <Wort> setze in <sterne> in gleichem Abstand den Inhalt des Zeigers (Zeigerinhalt ist zu diesem Zeitpunkt == <buchstabe>) */ sterne[pointer-Wort] = *pointer; /* setze Zeiger auf nächstes Vorkommen von Buchstabe NACH aktueller Position */ pointer = strchr(pointer+1, buchstabe); }
-
sterne[pointer-Wort] = *pointer;
Diese Zeile ist mir schleiferhaft!
Wenn doch eine Position, also eigentlich ein Zahlenwert in sterne[] stehen sollte, wie kann dann "pointer-Wort" drinnen stehen.
Welche Werte haben diese beiden, und wäre der dann nicht negativ, da Wort ja das gesamte Wort sit und pointer nur ein Ausschnitt?
Oder steh ich jetzt auf der Leitung?!
-
sterne[pointer-Wort] = *pointer;
<pointer-Wort> ergibt die Position/Abstand von <pointer> zum Zeiger auf <Wort>.
Zeiger auf Wort bedeutet einfach den Beginn der Zeichenkette <Wort>, für "Emil" und buchstabe == 'i' ergibt sich also pointer-Wort == 2.
pointer zeigt also auf Wort[2], d.h. pointer==&Wort[2].
Jetzt wird nur noch sterne[2] auf <buchstabe> gesetzt, dennsterne[pointer-Wort] = *pointer;
entspricht genau
sterne[pointer-Wort] = buchstabe;
da
*pointer == buchstabe
ist.
-
Habs verstanden!
Wort steht einfach nur für den Anfang des gesamten Wortes, also eigentlich 0.
Das heißt [pointer-Wort] ist eigentlich nur pointer als Wert sozusagen!Ich denke ich habs jetzt!
DANKE AN ALLE!
Wollte ja nicht nur, dass es funktioniert, sondern es auch verstehen!