2017-10-25 6 views
1

Ich wollte ein Spiel erstellen, das eine Zeichenfolge randomisiert und der Benutzer muss erraten, was die ursprüngliche Zeichenfolge ist, aber wenn ich die randomisierte Zeichenfolge anzeigen, wird es zweimal gedruckt. einmal randomisiert einmal nicht randomisiert. Hier ist mein Code:Warum wird meine Zeichenfolge zweimal ausgedruckt?

#include <stdio.h> 
#include <stdlib.h> 
#include <time.h> 
int checkWin(char guess[], char word[]); 
void jumble(char array[]); 
int main() 
{ 
    srand(time(NULL)); 
    char word[5] = {'h', 'e', 'l', 'l', 'o'}; 
    char scramble[5] = {'h', 'e', 'l', 'l', 'o'}; 
    char guess[5]; 
    jumble(scramble); 
    printf("The jumled word is: %s\n",scramble); 
    printf("Enter a guess: "); 
    for(int i = 0; i < 5; i ++) 
    { 
     scanf(" %c",&guess[i]); 
    } 
    printf("\n"); 
    if(checkWin(guess,word)) 
     printf("You win!"); 
    else 
     printf("You lose"); 
} 
void jumble(char array[]) 
{ 
    int a,b,c; 
    for(a = 1; a<6; a++) 
    { 
     b = rand()%5; 
     c = rand() %5; 
     if(b==c) 
     { 
      a--; 
      continue; 
     } 
     char temp = array[b]; 
     array[b] = array[c]; 
     array[c] = temp; 
    } 
} 
int checkWin(char guess[], char word[]) 
{ 
    int a = 0; 
    for(int i = 0; i < 5; i ++) 
    { 
     if(guess[i] == word[i]) 
      a++; 
    } 
    if(a==5) 
     return 1; 
    else 
     return 0; 
} 

, wenn der Benutzer die Zeichenfolge errät es funktioniert gut, aber wenn ich versuche, den verschlüsselten String i wie bekommen etwas anzuzeigen:

The jumled word is: ollehhello" 
Enter a guess: hello 

You win! 
Process returned 0 (0x0) execution time : 9.645 s 
Press any key to continue. 

ich weiß nicht, was los ist, falsch mit der Schnur, so würde jede Hilfe geschätzt werden.

+0

Bitte den Code thinkin schreiben g, dass es für Menschen ist. Wenn Code nur für Compiler geschrieben wurde, sollte er nicht in Englisch geschrieben werden müssen. –

Antwort

6

Ihre Zeichenfolgen sind nicht NUL terminiert, so dass der %s-Formatcode durch beide läuft (Stapelvariablen werden normalerweise Rücken an Rücken angeordnet, wenn keine Ausrichtungspolsterung erforderlich ist, obwohl dies vom Standard nicht garantiert wird)) bis es schließlich ein zufälliges NUL Byte findet (auf einem anderen Compiler, könnte es ziemlich viel mehr Kauderwelsch oder Crash drucken).

Um dies zu beheben, verwenden Stringliterale (das implizit eine \0 hinzufügen), fügen Sie die \0 manuell oder Größe sie eine größer als Sie (die zusätzlichen Elemente sind implizit Null-ed) zB initialisieren:

// Not declaring sizes; the arrays size based on the literal to size 6 
char word[] = "hello"; 
char scramble[] = "hello"; 

oder

// Again, autosizing to 6 
char word[] = {'h', 'e', 'l', 'l', 'o', '\0'}; 
char scramble[] = {'h', 'e', 'l', 'l', 'o', '\0'}; 

oder

// Explicit sizing to 6, implicit initialization of uninitialized element to 0 
char word[6] = {'h', 'e', 'l', 'l', 'o'}; 
char scramble[6] = {'h', 'e', 'l', 'l', 'o'}; 
+0

Danke, das hat mein Problem gelöst :) Ich akzeptiere die Antwort, wenn ich kann –

Verwandte Themen