2016-04-01 18 views
2

Meine Aufgabe ist es, den Nachnamen eines Arztes mit nur Kleinbuchstaben zu schreiben und am Ende mit einem Punkt ('.'), dass der Benutzer mit der Ausgabe gedruckt wird. Die aufgewendete Aufgabe besteht darin, ein System für medizinische Termine zu erstellen:C: Wie kann ich einen Namen eingeben und mit '.' (Dot)

#include<stdio.h> 
#include<stdlib.h> 
int main(){ 
    fflush(stdin); 
    int count = 0, flag = 0; 
    char Nameplate; //last name of the doctor 
    printf("Please enter the last name of your doctor(please type with only small letters):\n"); 
    Nameplate = getchar(); 
    do{ 
     Nameplate = getchar(); 
    } while (Nameplate >= 'a' && Nameplate <= 'z' && Nameplate == '.'); 
    if (!(Nameplate >= 'a' && Nameplate <= 'z' && Nameplate == '.')){ 
     flag = 1; 
    } 
    else if (Nameplate == '\n'){ 
     flag = 0; 
     count++; 
    } 
    if (flag == 1){ 
     printf("Invalid input,"); 
     fflush(stdin); 
     main(); 
    } 
    else if (flag == 0){ 
     printf("\n Your appointment has been successfully canceled.\n\n"); 
    } 
    return 0; 
} 

Jetzt funktioniert dieser Code nicht. Es funktioniert, wenn ich den Punkt nicht verwende, aber wenn ich den Punkt betrete, beginnen die Probleme.

+0

Haben Sie Ihre eigene Frage gelesen haben? Denkst du, es ist sogar lesbar? – kaylum

+0

Ich versuche zu reparieren und bearbeiten, dass tut mir leid –

+1

Ich habe versucht, Ihre Q in Form etwas zu hämmern, aber guten Gott bitte lesen [Hilfe] und [fragen], bevor Sie eine andere Frage stellen. cc @ kaylum – Magisch

Antwort

3

Versuchen

while ((Nameplate >= 'a' && Nameplate <= 'z') || (Nameplate == '.')) 

statt

while (Nameplate >= 'a' && Nameplate <= 'z' && Nameplate == '.') 
+1

Sie haben vielleicht bemerkt, dass auf dieser Seite niemand Code so formatiert ist, wie Sie ihn formatiert haben. Es gibt einen Grund dafür. – dandan78

+0

Ich habe keine Ahnung. Ich bin ein Anfänger. – froghramar

+1

Es gibt Hunderte von Anfängern, die jeden Tag Stackoverflow beitreten. Lesen Sie die Hilfe, lauern Sie, machen Sie sich mit der Seite vertraut, und beginnen Sie dann, etwas beizutragen. Es ist viel weniger schmerzhaft für jeden auf diese Weise. – dandan78

2

Auch bei einer Änderung der Test für Kleinbuchstaben und Zeit, haben Sie immer ein potenzielles Problem, weil der Benutzer eine Periode, in der haben könnte Name, aber immer noch keine Periode am Ende. nur

Dieser Code prüft, ob Kleinbuchstaben, das letzte Zeichen des Ausschlusses und prüft dann, dass das letzte Zeichen eine Periode ist.
Auch gibt es einige Kontrolle über die Länge des Namens.

int main() 
{ 
    int flag, n; 
    char *Nameplate = malloc(22); //last name of the doctor 
    fflush(stdin); 

    while(1) { 
     printf("Please enter the last name of your doctor(please type with only small letters):\n"); 
     printf("End name with a period/full stop\n"); 
     fgets(Nameplate, 20, stdin); 

     /* test for all valid lower case letters */ 
     flag = 0; 
     for(n = 0; n < strlen(Nameplate) - 2; n++) { 
      if (!('a' <= Nameplate[n] && Nameplate[n] <= 'z')) { 
       /* not a lower case character */ 
       flag = 1; 
       break; 
      } 
     } 

     /* now test for terminating period */ 
     if(Nameplate[strlen(Nameplate) - 2] != '.') { 
      /* no period at end of name */ 
      flag = 2; 
     } 

     /* handle errors or accept */ 
     if(flag == 1) { 
      printf("small letters only\n"); 
     } else if (flag == 2) { 
      printf("remember to end with a period/full stop\n"); 
     } else { 
      /* name was all lower case with terminating period so exit input */ 
      break; 
     } 
    } 

    printf("\n Your appointment with %s has been successfully canceled.\n\n", Nameplate); 
    free(Nameplate); 
    return 0; 
} 
+0

Warum 'strlen (Typenschild) -2'? Sicher "-1"? Ich denke, du denkst an die "schleppende Nul", aber das ist nicht im Ergebnis enthalten, das von strlen zurückgegeben wird. –

+0

@MartinBonner strlen (Typenschild) -2 gibt einen Punkt am Ende des von stdin eingegebenen Namens zurück, der durch Enter beendet wird. Ich habe überprüft, dass dies der Ort ist. 'erscheint in der Zeichenfolge - geben Sie es selbst, nur um sicher zu sein – anita2R

+0

Got it. Es ist nicht das abschließende nul, es ist das nachfolgende '\ n'. –

0

Wenn ich verstehe Sie ein ärztliches Namen eingeben möchten einen Termin zu vereinbaren, behandeln nur Kleinbuchstaben, und wenn das letzte Zeichen ist ein '.' den Termin stornieren, können Sie Ihre Logik leicht neu anordnen und das erreichen Ziel, während die Interpunktion in der Mitte erhalten bleibt.

Darüber hinaus wird jedes Mal, wenn Sie Eingabe einnehmen, stellen eine Aufforderung für Ihre Benutzer, so dass sie nicht dort an einem blinkenden Cursor suchen sitzen mich gefragt, ob das Programm hing.

Wenn obere/untere-case-Umwandlungs Handhabung, gibt es keinen Grund, den Benutzer zu zwingen, nur in der einen oder anderen zu gelangen. Sie können einfach überprüfen, welche Eingabe Sie in transparenter Weise bereitstellen. Die ctype.h Header-Datei enthält die tolower und toupper Zeichenumwandlungen, oder Sie können einfach verstehen, dass die 6th-bit in 7-bit ASCII ist das Case-Bit und schalten Sie es wie erforderlich, um die Fall-Konvertierung zu erreichen.

Dies ist nur ein Beispiel, es gibt viele Möglichkeiten, um die Stücke zusammen:

#include <stdio.h> 

#define MAXC 64 

int main (void) { 

    int c = 0, cnx = 0, i = 0; 
    char name[MAXC] = ""; 

    printf ("\n enter doctor's name (end with '.' to cancel): "); 
    while (i + 1 < MAXC && (c = getchar()) != '\n' && c != EOF) 
     if (('a' <= c && c <= 'z') || c == '.' || c == ' ') 
      name[i++] = c;      /* add to name  */ 
     else if ('A' <= c && c <= 'Z')   /* if upper-case  */ 
      name[i++] = c^(1u << 5);   /* convert to lower */ 
    if (i && name[i-1] == '.') {    /* last is '.'  */ 
     cnx = 1;        /* set cancel flag */ 
     name[--i] = 0;       /* overwrite last '.' */ 
    } 
    else 
     name[i] = 0;       /* nul-terminate name */ 

    if (cnx) /* appointment canceled */ 
     printf ("\n Your appointment with doctor '%s' has been canceled.\n\n", 
       name); 
    else  /* new appointment  */ 
     printf ("\n You have a new appointment with doctor '%s'.\n\n", name); 

    return 0; 
} 

Verwendung/Output

$ ./bin/appointment 

enter doctor's name (end with '.' to cancel): John J. Marks 

You have a new appointment with doctor 'john j. marks'. 


$ ./bin/appointment 

enter doctor's name (end with '.' to cancel): John J. Marks. 

Your appointment with doctor 'john j. marks' has been canceled. 
Verwandte Themen