2017-01-04 2 views
0

Ich habe ein Programm für ein seltsames Würfelspiel geschrieben, das im IF-ELSE-Teil vermutlich fehlerhafte Bedingungen hat. Ich füge ein Arbeitscode-Snippet ein, das das Problem repliziert.Was ist los mit den Bedingungen in diesem IF-ELSE?

#include <stdio.h> 
#include <stdlib.h> 

int main() 
{ 
    int rollTotal = 11; 
    int rollTotal2 = 10; 
    char userGuess[5] = "l"; 

    if ((userGuess == "h" && rollTotal2 > rollTotal) || (userGuess == "e" && rollTotal2 == rollTotal) || (userGuess == "l" && rollTotal2 < rollTotal)) 
    { 
     printf("You win :D \n"); 
    } 
    else 
    { 
     printf("You lose D: \n"); 
    } 

    return 0; 
} 

Erwartete Ausgabe: "Sie gewinnen: D" | Tatsächliche Ausgabe: "Sie verlieren D:"

Ich dachte, es war ein Problem mit den Bedingungen. Also änderte ich die Bedingungen zu (userGuess == 'h' && rollTotal2 > rollTotal) und so weiter (ich änderte die doppelten Anführungszeichen in ein einzelnes Anführungszeichen). Das gab mir die gleiche Ausgabe zusammen mit warning: comparison between pointer and integer. Dies führte mich zu einem verwirrenden SO Q&A, aus dem ich nichts machen konnte, weil ich diese Funktionen nicht kannte.

Das führte mich zu dem aktuellen Zustand meines Programms, das oben eingefügt ist (ich kehrte zurück zu doppelten Anführungszeichen). Ich glaube weiterhin, dass die Bedingungen der IF-ELSE fehlerhaft sind. Es gibt mir immer noch die gleiche Buggy-Ausgabe zusammen mit Warning: comparison with string literals results in unspecified behaviour. Dies führte mich zu einem weiteren fruitless endeavor.

Dieser Fehler liegt wahrscheinlich an meinem Mangel an Wissen über Zeiger und dergleichen und ist höchstwahrscheinlich extrem dumm. Bitte helfen Sie mir hier draußen.

Einige Informationen, die

IDE Hilfe- kann: Code :: Blocks

Compiler GCC

OS: Linux

Antwort

8

userGuess == "h" (und userGuess == "e")

Sie String vergleichen Literale mit Operator == was ist kein gültiger String-Vergleich in C - Sie sollten uns Die Standardbibliotheksfunktion für den Zeichenfolgenvergleich strcmp statt .

Andernfalls userGuess als einzelne char variabel machen, anstatt Array von char, und verwenden einzelnes Zeichen (Apostroph) für den Vergleich, wie

userGuess == 'h' 

Wie es aussieht, die Vergleich userGuess == "h" kompiliert aber sollte Ihnen eine Warnung geben, wenn Sie gcc -Wall Compiler-Flag aktivieren, zum Beispiel:

warning: comparison with string literal results in unspecified behavior [-Waddress] 

Es bedeutet (wie von Jonathan Leffler Kommentar unten erwähnt), Sie nicht die Zeichenfolgen selbst vergleichen, sondern stattdessen die beiden Zeiger (und "l" sind auf den gleichen Ort zeigen) - das ist gültig, aber im Allgemeinen bedeutungslos.

+0

Da sie * einzelne * Zeichen sind - warum schlagen Sie nicht vor, ** einfache Anführungszeichen ** zu verwenden, damit der Vergleich wie geschrieben gültig ist? (z. B. machen Sie es einen Zeichenvergleich anstelle eines String-Vergleich) –

+0

@ DavidC.Rankin ja, das ist der faire Punkt – artm

+0

Das ist eine faire Bearbeitung. Vergiss nicht 'char userGuess = '1';' um sicherzustellen, dass 'userGuess' auch ein Zeichen sein muss (andernfalls, nenne 'userGuess' nur für den Vergleich, zB '* userGuess == 'h'', etc .. zum Vergleich des ersten Zeichens. ':)' –

0

Sie vergleichen die Adresse Ihres Arrays userGuess mit der Adresse der Strings "h" und "e".

Die soltution dazu wäre

*userGuess == 'h' 

Name eines Arrays werden unter Verwendung der Adresse dieses Arrays ist, denselben als einen Zeiger.'h' ist ein wörtliches Zeichen, dann eine Zeichenfolge.

+0

Warum nicht einfach 'userGuess == 'h''? – RoadRunner

+0

Ich sehe nicht, warum das '*' erforderlich ist. Es funktioniert perfekt ohne es :) –

+0

@ MythicCocoa- Ich glaube, der Punkt hier ist, dass, da Sie 'char userGuess [5]' hatten, hätten Sie '* userGuess == 'h'' oder äquivalent' userGuess [ 0] == 'h''. Sie können 'userGuess == 'h'' nur verwenden, wenn Sie die Deklaration in' char userGuess' ändern, d. H. Kein Array. –

2

Bitte verstehen Sie das Konzept der Char-Datentyp. Wenn Sie nur ein Zeichen vergleichen wollen, deklarieren Sie die Variable nicht als String und vergleichen Sie sie wie ein Zeichen. Bitte finden Sie den Code unten.

#include <stdio.h> 
#include <stdlib.h> 
int main() 
{ 
int rollTotal = 11; 
int rollTotal2 = 10; 
char userGuess = 'l'; 
if ((userGuess == 'h' && rollTotal2 > rollTotal) || (userGuess == 'e' && rollTotal2 == rollTotal) || (userGuess == 'l' && rollTotal2 < rollTotal)) 
    { 
    printf("You win :D \n"); 
} 
else 
{ 
    printf("You lose D: \n"); 
} 
getchar(); 
return 0; 
} 

wenn Sie Zeichenfolge vergleichen wollen stattdessen benutzen Sie bitte strcmp() Funktion, um die Saiten zu vergleichen und die Header-Datei # include in Ihrem Code hinzuzufügen.

+0

Vielen Dank für Ihre antworte +1 –