Break语句在循环中不起作用(gcc)

时间:2016-01-25 16:19:21

标签: c linux gcc

我的代码有问题。该函数不会终止,它会永远循环。在Linux中编译C时,我有点新鲜(我来自Dev-C ++ ..)

以下是代码:

#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): 

并且它一直无休止地执行,直到我关闭终端。我真的不知道出了什么问题。有人帮忙:(

3 个答案:

答案 0 :(得分: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()的{​​{1}}将在输入缓冲区中留下换行符,x将立即返回而不会读取输入(由于fgets())。 您可以通过以下方式丢弃输入中留下的任何输入字符来处理此问题:

\n

(就在int c; while((c=getchar()) != '\n' && c!=EOF); 来电之前)。

  • 如果您为fgets()输入非数字输入,那么您将最终得到一个无限循环,因为x不会忽略无效输入。您应检查scanf()返回值并丢弃(如上所述使用getchar())所有输入字符如果失败。

答案 1 :(得分:1)

如果您希望能够输入新的$city = App\Cities::find($city_id); $product = $city->products()->where('product_id', $product_id)->get(); 循环,则应该在x循环内请求新的while。否则,第一个x将被一次又一次地使用,因为你永远不会退出循环。

答案 2 :(得分: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
}