2016-10-31 3 views
0

Ich muss es so machen, dass diese Schleife die Eingabe stoppt, wenn nichts eingegeben wird (die Eingabetaste wird gedrückt) für charTeacherFirstName. Ich habe das, aber das Problem ist, dass, wenn die Eingabetaste gedrückt wird, die Schleife einfach weiter nach Dingen fragt, als ob sie das Leerzeichen nicht gelesen hätte.Wie man die Schleife in diesem Code stoppt, wenn eine Leerzeile eingegeben wird in c

int main(void) 
{ 
    int intTeacherSalary[50]; 
    char charTeacherFirstName[50][50]; 
    char charTeacherLastName[50][50]; 

    do 
    { 
     printf("Enter the teacher's first name: "); 
     fgets(charTeacherFirstName, 50, stdin); 

     if (charTeacherFirstName == '\n') 
     { 
      break; 
     } 
     else 
     { 
      printf("Enter the teacher's last name: "); 
      fgets(charTeacherLastName, 50, stdin); 

      printf("Enter teacher's salary: "); 
      fgets(intTeacherSalary, 50, stdin); 
     } 

    } while (charTeacherFirstName != '\n'); 
} 
+2

und Ihren Zustand in der 'while' auch falsch und nutzlos, weil Ihr' if' es bereits behandelt. Kompiliere mit Warnungen auf und _read_ sie. Sie müssen nicht einmal hier posten. –

+0

Außerdem können Sie 'fgets()' nicht verwenden, um 'int' in' intTeacherSalary' zu lesen.Oder zumindest versucht dies zu einem undefinierten Verhalten zu führen, das wahrscheinlich nicht das ist, was Sie erwarten oder wollen. Vielleicht möchten Sie in ein 'char'-Array einlesen und dann das' int' (falls vorhanden) mit 'sscanf()' auslesen. –

+1

'if (charTeacherFirstName == '\ n')' Sie können die Zeichengleichheit in C auf diese Weise nicht testen. –

Antwort

1

Zuerst ist Ihr Code falsch. charTeacher...Name ist ein 2dim-Array und Sie verwenden es nicht so. Dann ...Salary ist int aber Sie lesen es mit fgets während es inkompatibel ist.

Auch kann man nicht vergleichen string und char, diese Dinge unterscheiden sich sehr.

So ein Char ist, was der Name sagt. Ein einzelnes Zeichen. 'a', 'b', '!', '5' sind Zeichen. Wenn Sie eine direkte Referenz auf sie verwenden, müssen Sie sie in einfache Anführungszeichen setzen '...'.

Strings sind wir sagen Reihe von Zeichen ("abc", "food", "what a nice weather". Sie können sie als Arrays denken, wie Sie sie deklariert haben. Sie können auch als Zeiger auf Zeichen deklariert werden und dann müssen Sie malloc(N * sizeof(char)) (oder so ähnlich) verwenden Speicher, um die für Ihren Betrieb erhalten. Wenn Sie an einer Schnur unmittelbare Beziehung wollen, müssen Sie es zwischen doppelten Anführungszeichen ("..."). Strings hat mit dem NULL Charakter beenden (dh '\0').

ich würde sagen, es ist irgendwie das selbe, was man über int und int [] oder int * in jedem Fall sagen würde

Um Strings zu vergleichen, müssen Sie strcmp verwenden. Verwenden Sie man strcmp, um zu sehen, wie es verwendet wird und was es zurückgibt und welche Bibliothek Sie benötigen, um #include.

Ihr Zustand sollte dann if (strcmp(charTeacherFirstName, "\n") == 0) break;

0

Es gibt mehrere Probleme im Code:

  • Sie testen nicht den Rückgabewert von fgets(). Es wird NULL am Ende der Datei zurückgeben, und Sie sollten nicht weiter aufgefordert für mehr Eingabe dann.

  • Sie sollten die Strings für jedes Array in das nächste Array-Element einlesen.

  • Sie brauchen keine do/while Schleife, Sie schon richtig das Ende Fall testen, eine for Schleife verwenden und stoppen, wenn die Arrays voll sind.

  • Sie lesen Zeilen in die Arrays, entfernen aber nicht den abschließenden Zeilenvorschub.

Hier ist eine korrigierte Version:

#include <stdio.h> 

void trim_linefeed(char *buf) { 
    int len = strlen(buf); 
    if (len > 0 && buf[len - 1] == '\n') 
     buf[len - 1] = '\0'; 
} 

int main(void) { 
    char buf[80]; 
    int intTeacherSalary[50]; 
    char charTeacherFirstName[50][50]; 
    char charTeacherLastName[50][50]; 
    int i, n; 

    for (n = 0; n < 50; n++) { 
     printf("Enter the teacher's first name: "); 
     if (!fgets(charTeacherFirstName[n], 50, stdin)) 
      break; 

     if (charTeacherFirstName[n][0] == '\n') 
      break; 
     trim_linefeed(charTeacherFirstName[n]); 

     printf("Enter the teacher's last name: "); 
     if (!fgets(charTeacherLastName[n], 50, stdin)) 
      break; 
     trim_linefeed(charTeacherLastName[n]); 

     printf("Enter teacher's salary: "); 
     if (!fgets(buf, sizeof buf, stdin)) 
      break; 
     if (sscanf(buf, "%d", &intTeacherSalary[n]) != 1) { 
      intTeacherSalary[n] = 0; 
     } 
    } 
    printf("%d teachers:\n", n); 
    for (i = 0; i < n; i++) { 
     printf("%s %s: %d\n", 
       charTeacherFirstName[i], 
       charTeacherLastName[i], 
       intTeacherSalary[i]); 
    } 
    return 0; 
} 
Verwandte Themen