我的代码有问题。该函数不会终止,它会永远循环。在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):
并且它一直无休止地执行,直到我关闭终端。我真的不知道出了什么问题。有人帮忙:(
答案 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
}