2011-01-10 5 views
0

Der Code, den ich schreibe, ist im Grunde eine Frage über die Frage, ob der Benutzer seinen Vornamen eingeben soll. Wenn der Name leer ist, dh der Benutzer vergißt, seinen Vornamen einzugeben, wird der Code erwähnen, daß der Benutzer vergessen hat, seinen Namen einzugeben und erneut zu fragen. Es sollte weiter gefragt werden, bis die Bedingung erfüllt ist.versteh meine Logik von meiner Weile, wenn Code in c? 37 Zeilen/Leerzeichen des Codes

// This sample compares user input to what is being typed. If the 
// input is void of any charicters before pressing enter, it will print a reply. 

#include <stdio.h> 
#include <string.h> 

int main() 
{ 
    char firstname[25]; 

    printf("Please enter your first name:"); 
    fgets(firstname,25,stdin); 

    // ask to enter in a name. If no name or text is present, 
    // will reply with no name entered 
    // and will loop untill a name is pressed and entered 

    do 
    { 
     printf("You pressed enter before entering your first name.\n Please enter first name");    
    } 
    while (firstname == NULL || strcmp(firstname,"")==0); 

    if(!strcmp(firstname, "firstname")) 
    { 
     printf("Thank you %s! for entering in your first name",firstname); 
    } 

    getchar(); 
} 

Es läuft nur einmal. Also, nicht sicher, warum es nicht weiter geht und auch, brechen Sie die Schleife zu sagen "thank you %s! Kann jemand ein anderes Beispiel geben, damit es funktioniert und ich kann es besser verstehen?

+0

es ist schon durcheinander! :) Verwenden Sie Syntaxfilter richtig –

+1

Halten Sie Ihren Einzug sauber! Ich schreibe seit fast 10 Jahren Code, und wenn Sie solchen Code schreiben, kann ich ihn nicht lesen. Wenn ein erfahrener Programmierer es schwer hat, das zu lesen, was hält Sie dann für leichter? – riwalk

+0

Ist das Hausaufgaben? – FrustratedWithFormsDesigner

Antwort

1

In der Schleife haben Sie nur eine einzige printf-Anweisung, die den Zustand der Schleife nicht ändert. Ziehen Sie in Betracht, die Zeile fgets(firstname,25,stdin) innerhalb der Schleife zu verschieben.

0

Nicht ganz Problem, das Sie stoßen, aber es ist eine, Sie bald begegnen werden:

if(!strcmp(firstname, "firstname")) 

strcmp 0 zurück, wenn die Strings gleich sind, und gibt einen positiven oder negativen Wert, wenn sie anders sind.

Das bedeutet, wenn Sie versuchen, und das Ergebnis als boolean zu interpretieren, strcmp kehrt true wenn die Saiten sind verschiedenen und false, wenn sie die gleiche sind.

Können Sie das Problem jetzt in der zitierten Zeile sehen?

0

Wie von Blagovest Buyukliev erwähnt, müssen Sie Ihre Fgets in die Schleife bewegen. Aber auch, fgets wird das Return-Zeichen in der Zeichenfolge enthalten (siehe here), so dass der Aufruf, es gegen "" zu vergleichen, nicht wie erwartet funktionieren wird.

Sie könnten es mit "\ n" vergleichen. Oder verwenden Sie gets, die den Zeilenumbruch nicht enthält.

Auch gibt es keinen Grund, Vorname gegen NULL zu überprüfen, es ist eine Stapelvariable, und wird nie NULL sein. Und am Ende wird Ihr printf nur ausgeführt, wenn der Vorname eines Benutzers "Vorname" ist, da Sie das vergleichen.

+0

Ich nehme an, Sie wollten sagen, der Grund, nicht gegen 'NULL' zu prüfen, ist, dass' Vorname' kein Zeiger ist. – jweyrich

+0

@jweyrich sind beide weitgehend genau. als ein Array-Name konvertiert er implizit zu einem Zeiger in vielen Kontexten, insbesondere der Adresse seines ersten Elements - und als ein dem Stapel zugeordnetes Objekt kann der Zeiger möglicherweise nicht null sein. –

Verwandte Themen