首先,我要提前感谢大家。我非常期待在计算机科学领域取得进步,并在我变得更加熟练的时候帮助其他人。
现在这是我的代码:
#include <stdio.h>
#include <stdlib.h>
#define RECORDS 30
/*Questions
Formatting display() - can we use spaces to format?
Is the patient structure supposed to be global or local in enter()?
*/
void enter();
void display();
void update();
void loadDisk();
void writeDisk();
void emptyDisk();
void sort();
void clear();
struct patient
{
char * name;
int age;
double highBP, lowBP, riskFactor;
};
struct patient * db[RECORDS];
int counter = 0;
main()
{
int flag = 1;
while (flag == 1)
{
printf("---------------------------------------------------------\n");
printf("|\t(N)ew record\t(D)isplay db\t(U)pdate record |\n");
printf("|\t(L)oad disk\t(W)rite disk\t(E)mpty disk |\n");
printf("|\t(S)ort db\t(C)lear db\t(Q)uit |\n");
printf("---------------------------------------------------------\n");
printf("choose one: ");
char selection = getchar();
printf("selection %c\n", selection);
if ((selection == 'n') || (selection == 'N'))
{
//New record
enter();
}
else if ((selection == 'd') || (selection == 'D'))
{
//Display db
//printf("display %d\n", flag);
display();
}
else if ((selection == 'u') || (selection == 'U'))
{
//Update db
update();
}
else if ((selection == 'l') || (selection == 'L'))
{
//Load disk
loadDisk();
}
else if ((selection == 'w') || (selection == 'W'))
{
//Write disk
writeDisk();
}
else if ((selection == 'e') || (selection == 'E'))
{
//Empty disk
emptyDisk();
}
else if ((selection == 's') || (selection == 'S'))
{
//Sort db
sort();
}
else if ((selection == 'c') || (selection == 'C'))
{
//Clear db
clear();
}
else if ((selection == 'q') || (selection == 'Q'))
{
//Quit
flag = 0;
}
else
{
printf("not a vaild input\n");
}
}
}
void enter()
{
/*struct patient temp;
printf("name: "); sscanf("%s", temp.name);
printf("age: "); scanf("%d", temp.age);
printf("high bp: "); scanf("%f", temp.highBP);
printf("low bp: "); scanf("%f", temp.lowBP);
db[counter] = (struct patient *) calloc(1, sizeof(temp));
*db[counter] = temp;
//printf("%s, %d, %f, %f", db[counter]->name, db[counter]->age, db[counter]->highBP, db[counter]->lowBP);
counter++;*/
}
void display()
{
}
void update()
{
}
void loadDisk()
{
}
void writeDisk()
{
}
void emptyDisk()
{
}
void sort()
{
}
void clear()
{
}
运行时我遇到的问题是输入选项后菜单显示两次。我无法理解出错的地方,但我怀疑它与getchar有关,它存储了选择和新行字符,因此运行了两次。这也意味着最终的else语句将会运行,它会这样做。
我认为我已经对问题进行了三角测量,只是不确定如何修复它。提前谢谢!
答案 0 :(得分:2)
如果问题出在getchar上,它看起来确实如此,为什么不使用不同的函数呢?
尝试更换:
char selection = getchar();
有了这个:
char selection;
scanf("%c",&selection);
如果您担心单个字符溢出,请对字符串执行scanf()并仅使用支票中的第一个字符:
char selection, selectionstr[20];
scanf("%s",selectionstr);
selection = selectionstr[0];
答案 1 :(得分:1)
getchar
也会返回'\n'
个字符。
答案 2 :(得分:0)
是的,问题是您的输入始终是一个字符串,至少有一个字符后跟换行符。如果选择为'q'或者使用除getchar之外的函数并修剪你的输入,我会改变你的循环以便它终止。
答案 3 :(得分:0)
我认为你可以使用诅咒来做到这一点! Here是一个您可能会觉得有用的网站。 Curses是c。
的光标控制库从手册:
最初,终端可能处于cbreak模式,也可能不处于cbreak模式 遗传;因此,一个程序应该调用cbreak或nocbreak explic- itly。大多数使用curses的交互式程序都设置了cbreak模式。 请注意,cbreak会覆盖raw。