2016-01-25 2 views
0

У меня проблема с кодом. Функция не будет завершена, и она продолжит цикл навсегда. Я своего рода новый, когда речь идет о компиляции C в Linux (я из Dev-C++ ..)Оператор break не работает в цикле (gcc)

Вот код:

#include<stdio.h> 
#include<string.h> 
#include<stdlib.h> 
#define MAX 10 

struct student{ 
    char lname[20]; 
    char fname[20]; 
    int idnum[8]; 
    int year; 
}; 

struct course{ 
    char cname[4]; 
    struct student stud[MAX]; 
}; 


int main() 
{ 
    struct course c[0]; 

    userSelect(&c); 
    return 0; 
} 

int userSelect(struct course *p_course) 
{ 
    int z=0, x; 
    printf("1 - Create course\n2 - Edit course\n3 - Add student(s)\n4 - Edit student data\n5 - Delete\n6 - Quit"); 
    scanf("\n%d", &x); 
    while(z==0){ 
     switch(x){ 
      ccase 1: userCreateCourse(p_course); 
      break; 
      //case 2: userEditCourse(&c); 
      //break; 
      //case 3: userCreateStudents(&c); 
      //break; 
      //case 4: userEditStudents(&c); 
      //break; 
      case 6: printf("bye"); 
      z++; 
      break; 
      default: printf("Invalid input"); 
      break; 
     } 
    } 
} 

int userCreateCourse(struct course *p_course) 
{ 
    int *cnum=0, i; 

    cnum=(int *)malloc(sizeof(int)); 
    cnum++; 
    printf("Enter course (ex: BSCS): "); 
    fgets(p_course[*cnum-1].cname, sizeof(p_course[*cnum-1]), stdin); 
    puts(p_course[*cnum-1].cname); 
} 

Если я выбираю 1, это выход:

 
1 - Create course 
2 - Edit course 
3 - Add student(s) 
4 - Edit student data 
5 - Delete 
6 - Quit1 

Enter course (ex: BSCS): H��4k 


Enter course (ex: BSCS): AAAA 

AAAA 


Enter course (ex: BSCS): AAAA 

AAAA 

Enter course (ex: BSCS): 

и он продолжает делать это бесконечно, пока не закрою терминал. Я действительно не знаю, что это неправильно .. Кто-то помочь :(

+1

Не записывайте код как этот 'case 6: printf (" bye "); z ++; break;' это ужасно. Трудно читать и уродливо. Я не понимаю, чего ты хочешь. –

+0

Простите, что я был в спешке, когда я сделал заявление о переключении. Сейчас я отредактирую его. – Nari

+0

'case 6: printf (" bye "); z ++; break;' не выполняется вообще. Поэтому значение z всегда равно 0. – Jeyaram

ответ

3

Вы должны прочитать xвнутри петли. Случается, что x остается тем же самым значением, которое вы ввели в первый раз. Так что case 1: всегда исполняется.


Вы можете использовать цикл Do-While, как:

do{ 
printf("1 - Create course\n2 - Edit course\n3 - Add student(s)\n4 - Edit student data\n5 - Delete\n6 - Quit\n"); 
scanf("\n%d", &x); 

    switch(x){ 
     case 1: userCreateCourse(p_course);break; 
     //case 2: userEditCourse(&c);break; 
     //case 3: userCreateStudents(&c);break; 
     //case 4: userEditStudents(&c);break; 
     case 6: printf("bye");z++;break; 
     default: printf("Invalid input");break; 
    } 
} while(z==0); 

Но помните, есть целый ряд вопросов, с scanf() + fgets() подходом.

  • scanf(), который читает x оставит символ новой строки во входном буфере и fgets() вернется немедленно без чтения ввода (из-за \n). Вы можете справиться с этим, отбросив любые входные символы, оставшиеся на входе, с помощью:

.

int c; 
while((c=getchar()) != '\n' && c!=EOF); 

(незадолго до fgets() звонок).

  • Если вход не-номер для ввода x, то вы будете в конечном итоге с бесконечным циклом, поскольку scanf() не игнорирует недопустимый ввод (ы). Вы должны проверить возвращаемое значение scanf() и сбросить (используя getchar(), как указано выше) все входные символы, если они не сработали.
+0

OH! Я не поставил инструкцию scanf в цикле! О, черт возьми, я чувствую себя таким немым сейчас. – Nari

+0

Ну, теперь проблема в том, что он не перестает просить меня о вводе. Он пропускает fgets и печатает строку мусора D: – Nari

+0

См. Обновление для почему. Я предлагаю вам прочитать 'x' тоже с' fgets() 'для чтения строки, а затем использовать' sscanf() 'для чтения' x'. –

0

Ну это делает перерывы, но он возвращается снова в цикле, так как z == 0 остается true. Он вспыхивает ваш переключатель случае, не из вашего цикла. В конец переключателя вы должны изменить значение z что-то другое, чем 0 нравится:

while(z==0){ 
    switch(x){ 
     case 1: userCreateCourse(p_course);break; 
     //case 2: userEditCourse(&c);break; 
     //case 3: userCreateStudents(&c);break; 
     //case 4: userEditStudents(&c);break; 
     case 6: printf("bye");z++;break; 
     default: printf("Invalid input");break; 
    } 
    z = 1; 
} 

Было бы лучше для вас, чтобы использовать boolean как

boolean done = false; 
while(!done){ 
    switch(smth){ 
     // do smth 
    } 
    done = true 
} 
+0

Это не решит проблему. –

+0

Да, так оно и есть. Проверьте 1-й блок кода :) –

+0

Цикл 'while' бессмыслен, если у вас есть' z = 1' внизу. –

1

Вы должны попросить новый x внутри цикла while, если вы хотите, чтобы иметь возможность ввести новый. В противном случае первый x будет использоваться снова и снова, так как вы никогда не выходите из цикла.

Смежные вопросы