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

标签 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): 

它会不停地这样做,直到我关闭终端。我真的不知道出了什么问题..有人帮忙:(

最佳答案

您需要在循环内阅读 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() 方法存在许多问题。

  • 读取 xscanf() 将在输入缓冲区中留下一个换行符,而 fgets() 将立即返回而不读取输入 (由于 \n)。 您可以通过丢弃输入中剩余的任何输入字符来处理此问题:

.

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

(就在 fgets() 调用之前)。

  • 如果您为 x 输入非数字输入,那么您将以无限循环结束,因为 scanf() 不会忽略无效输入.您应该检查 scanf() 返回值,如果失败则丢弃(如上所述使用 getchar())所有输入字符。

关于c - Break 语句在循环中不起作用 (gcc),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34997260/

相关文章:

c - 遍历 C 中的枚举?

c - 主函数之外的 printf 抛出错误

c++ - 将共享库的搜索路径更改为 Makefile 中提供的 rpath

linux - vim中的水平线

php - 从 public_html 文件夹外的文件夹在站点上显示图像

c - 编译C文件时出现Unsupported x86-64 instruction set错误

为参数 `type name' 指定的 C 函数指针错误存储类

c 程序时间转换 24 小时到 12 小时

c - 如何处理socket服务器中select()引起的 "Bad file descriptor"?

linux - CentOS系统上的gcc版本问题