2016-11-29 7 views
0

Ich versuche, den Goto und die Etiketten zu verwenden, um durch dieses Programm zu navigieren, aber wenn ich durch das Programm navigieren, sind die Ergebnisse nicht wie erwartet.C - Looping/Navigieren mit goto

Wenn Sie das Programm laden, sollten Sie aufgefordert werden, die Anzahl der Schüler in der Klasse einzugeben. Wenn Sie einen nicht numerischen Wert eingeben, sollte er Sie zurücksenden, um den Wert erneut einzugeben. Es scheint jedoch weiter durch das Programm zu gehen. Wenn Sie einen numerischen Wert eingeben, sollte der Rest des Programms normal durchlaufen werden. Es scheint jedoch weiterhin eine Schleife zu bilden. Schließlich, hier sind keine Fehler/Warnungen von meinem Compiler zur Verfügung gestellt.

Frage (n): Habe ich einen Fehler in meinem Code? Gibt es eine bessere Methode, um das zu erreichen, was ich versuche? Wäre es besser/schlauer, das Programm nur mit Funktionen und While-Schleifen zu schreiben, anstatt einen prozeduralen/vereinfachenden Ansatz zu verwenden?

Programm:

#include <stdio.h> 
#include <string.h> 
#include <ctype.h> 
int areStudents; 

struct Student 
{ 
    int id; 
    char name[50]; 
    char address[50]; 
    char phone[20]; 
}; 

int main() 
{ 
    char userInput1, userInput2, currentName[50], currentAddress[50], currentPhone[20]; 
    begining: 
    printf("\nEnter the number of students in the class: "); 
    scanf("%c", &userInput1); 
    if(!isdigit(userInput1)) 
    { 
     printf("\nThe input you selected was not valid. Please enter another option\n"); 
     //userInput1 = '0'; 
     goto begining; 
    } else if(isdigit(userInput1)){ 
     // asks users to input P, E, H 
     struct Student student[userInput1]; 
     label1: 
     printf("=>Press P to print the list\n\n=>Press E to enter the student data\n\n=>Press H For help\nPlease enter your selection: "); 
     scanf("%c", &userInput2); 

     switch(userInput2) // switch for choices P, E, and H 
     { 
      case 'p': 
      case 'P': 
      if(areStudents != 1) 
      { 
       printf("\n**You have not set any student variables. Please set them before using this option**\n\n"); 
       goto label1; 
      } else { 
       // print the list of student info 
       for(int i=0; i>=userInput1; i++) 
       { 
        student[i].id = i+1; 
        printf("\nStudent %d name is: %s", i+1, student[i].name); 
        printf("\nStudent %d address is: %s", i+1, student[i].address); 
        printf("\nStudent %d phone number is: %s", i+1, student[i].phone); 
       } 
       break; 
      } 

      case 'e': 
      case 'E': 
      for(int j=0; j>=userInput1; j++) 
      { 
       student[j].id = j+1; 
       printf("\nStudent %d name is: ", j+1); 
       scanf("%s", currentName); 
       strcpy(student[j].name, currentName); 

       printf("\nStudent %d address is: ", j+1); 
       scanf ("%s", currentAddress); 
       strcpy(student[j].address, currentAddress); 

       printf("\nStudent %d phone number is: ", j+1); 
       scanf("%s", currentPhone); 
       strcpy(student[j].phone, currentPhone); 
      } 
      areStudents = 1; 
      goto label1; 

      case 'h': 
      case 'H': 
      printf("Select E or e to enter the data entry mode.\n\nAfter you have entered all your data, you can print the data by entering p or P.\n\nYou can only print after entering your data... otherwise, you will see some garbage values."); 

      default: 
      goto label1; 
     } 
    } 
    return(0); 
} 

Ergebnis (nicht numerisch):

Enter the number of students in the class: d 

The input you selected was not valid. Please enter another option 

Enter the number of students in the class: 
The input you selected was not valid. Please enter another option 

Enter the number of students in the class: 

Ergebnis (numerisch):

Enter the number of students in the class: 3 
=>Press P to print the list 

=>Press E to enter the student data 

=>Press H For help 
Please enter your selection: =>Press P to print the list 

=>Press E to enter the student data 

=>Press H For help 
Please enter your selection: 
+4

* Wäre es besser/schlauer, das Programm nur mithilfe von Funktionen und While-Schleifen neu zu schreiben, anstatt zu versuchen, einen prozeduralen/vereinfachenden Ansatz zu verwenden? * ** Ja ** –

Antwort

0

Zunächst scheint es, wie das Programm überspringt die scanf Linie selbst.
Probieren Sie dies, stellen Sie ein Leerzeichen vor% c, für jeden scanf, den es im Programm gibt. ZB:
scanf(" %c",&userInput1);

Auch initialisieren die areStudents Variable auf 0 und in der for-Schleife mit j, der Code
for(j=0;j>=userInput1;j++)
Wenn Sie ist haben bemerkt, das die zweite Bedingung muss "j < = userInput1" sein.