![](/img/trans.png)
[英]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.