[英]In C, how do I only accept certain strings and continue to ask the user for input until valid input is entered?
[英]How do you delete certain strings from a textfile based on user input in c
我必须为我的编程课用 c 编写一个医院管理系统。 病人名单和收治病人工作得很好,但我不能正常出院。 我的程序要么无法根据他们的 ID 找到患者,要么一次让多名患者出院。 当我尝试运行它时没有警告或错误。 我目前的方法是使用 strcmp 将患者的 ID 与用户输入的 ID 进行比较。
这是我的代码:
#include <string.h>
#include <stdbool.h>
#include <stdlib.h>
#include <windows.h>
#define MAX 99
struct patient{
char raum[MAX];
char nummer[MAX];
char alter[MAX];
char name[MAX];
char geschlecht[MAX];
char krankheit[MAX];
}p;
int main(void){
FILE *akten;
int eingabe;
do{
printf("Krankenhausinformationssystem:\n");
printf("1.Patientenliste.\n");
printf("2.Patienten hinzufuegen.\n");
printf("3.Raumzuteilung.\n");
printf("4.Patienten entlassen.\n");
printf("5.Beenden.\n");
scanf("%i", &eingabe);
switch(eingabe){
case 1: printf("Patientenliste:\n");
printf("%-10s %-20s %-20s %-20s %-20s %s\n", "Nummer", " Raum", "Name", "Geschlecht", "Alter", "Krankheit");
printf("-------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n");
akten = fopen("akten.txt", "rb");
while(fread(&p, sizeof(p), 1, akten) == 1){
printf("%-10s %-20s %-20s %-20s %-20s %s\n", p.raum, p.nummer, p.alter,p.name,p.geschlecht,p.krankheit);
}
fclose(akten);break;
case 2: printf("Patienten hinzufuegen:\n");
akten = fopen("akten.txt","ab");
printf("Nummer:\n");
fflush(stdin);
scanf("%s",p.nummer);
printf("Raum:\n");
fflush(stdin);
gets(p.raum);
printf("Name:\n");
fflush(stdin);
gets(p.name);
printf("Geschlecht:\n");
fflush(stdin);
gets(p.geschlecht);
printf("Alter:\n");
fflush(stdin);
gets(p.alter);
printf("Krankheit:\n");
fflush(stdin);
gets(p.krankheit);
fwrite(p.nummer, sizeof(p.nummer), 1, akten);
fwrite(p.raum, sizeof(p.raum), 1, akten);
fwrite(p.name, sizeof(p.name), 1, akten);
fwrite(p.geschlecht, sizeof(p.geschlecht), 1, akten);
fwrite(p.alter, sizeof(p.alter), 1, akten);
fwrite(p.krankheit, sizeof(p.krankheit), 1, akten);
fclose(akten);break;
case 4: printf("Patienten entlassen:\n");
char nummer[MAX];
int f=0;
printf("Patientennummer:\n ");
fflush(stdin);
scanf("%s", nummer);
FILE *ft;
akten = fopen("akten.txt", "rb");
ft = fopen("temp.txt", "wb");
while(fread(&p, sizeof(p), 1, akten) == 1){
//strcpy(*nummer); strcpy(*p.nummer);
//int vergleich = strcmp(p.nummer,nummer);
if(nummer == p.nummer){
f=1;
}else{
fwrite(&p, sizeof(p), 1, ft);
}
}
if(f==1){
printf("Patient wurde entlassen.\n");
}else{
printf("Patient nicht gefunden !\n");
}
fclose(akten);
fclose(ft);
remove("akten.txt");
rename("temp.txt", "akten.txt");
break;
case 5: exit(0);
default: printf("Ungueltige Eingabe");break;
}}
while(eingabe != 5); return 0;} ```
我测试了你的代码,从那个测试中,我有一些观察和建议。 首先,由于您的患者编号条目实际上是一个字符串,因此我将“if”测试更改为使用注释中所述的“strcmp”函数。
/* if(nummer == p.nummer){ */
if((strcmp(nummer, p.nummer) == 0)) {
在我修改您的新患者数据输出以将患者结构而不是单个元素写入文件之前,我似乎仍然难以使该功能正常工作。
fwrite(&p, sizeof(p), 1, akten);
此外,为了保持一致,我用类似的“scanf”函数重构了所有“gets”函数,而不是混合使用。 以下是一个这样的条目。
scanf("%s", p.name);
这种一致性似乎允许放电功能发挥作用。 来吧,试试看。 如果您需要查看任何函数中的更多代码,请告诉我。
希望有帮助。
问候。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.