我的代码有点问题。该函数不会终止,并且会一直循环下去。在 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()
方法存在许多问题。
- 读取
x
的scanf()
将在输入缓冲区中留下一个换行符,而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/