У меня есть простая телефонная книга, написанная на C, которая сохраняет входную информацию в текстовый файл на моем компьютере.Программа телефонной книги C: как выйти из бесконечного цикла и как вернуться в меню оператора switch
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <stdbool.h>
void validateName(char name[], FILE *fptr);
void validateID(char id[], FILE *fptr);
void validateScore(int score, FILE *fptr);
void addContact(char name[], char id[], int score, FILE *fptr);
void printContact(FILE *fptr);
void printAll();
int main()
{
char name[30], id[10];
int score;
int i;
FILE *fptr;
fptr = fopen("C:\\c\\program.txt","w");
if(fptr == NULL)
{
printf("Error!");
exit(1);
}
else {
bool flag = true;
do{
printf("\n1. Press 1 to display record\n"
"2. Press 0 to add a new contact\n"
"3. Press -1 to display all records\n\n");
int option;
scanf("%d", &option);
switch(option) {
case 1:
printContact(fptr);
flag = false;
break;
case 0:
addContact(name, id, score, fptr);
flag = false;
break;
case -1:
printAll();
flag = false;
break;
default:
printf("wrong choice, try again\n\n");
}
} while(flag);
fclose(fptr);
return(0);
}
}
void validateName(char name[], FILE *fptr){
bool flag = true;
while(flag){
fgets(name, 30, stdin);
if ((strlen(name) < 3) || (strlen(name) > 20)) {
printf("error\nplease enter name again: ");
} else {
flag = false;
}
}
}
void validateID(char id[], FILE *fptr){
bool flag = true;
while(flag) {
if (!isalpha(id[0])){
printf("enter a letter as first char\n");
}
else if(strlen(id) > 10) {
printf("error too much numbers \n");
} else {
flag = false;
}
}
}
void validateScore(int score, FILE *fptr) {
if(score >= 0 && score <= 100) {
fprintf(fptr, "SCORE: %d\n", score);
} else {
printf("invalid input");
(exit(1));
}
}
void addContact(char name[], char id[], int score, FILE *fptr) {
//first name
printf("Enter name: ");
scanf("%s", name);
validateName(name, fptr);
fprintf(fptr,"NAME: %s \n", name);
//id
printf("Enter id: ");
scanf("%s", id);
validateID(id, fptr);
fprintf(fptr,"STUDENT NO: %s\n", id);
//score
printf("enter score: ");
scanf("%d", &score);
validateScore(score, fptr);
}
void printContact(FILE *fptr) {
int c;
char contacts[50];
while((c = getchar()) != EOF) {
fscanf(fptr, "%s", &contacts);
for(int i = 50; i < 50; i++){
printf("%s", &contacts);
}
}
}
void printAll() {
}
мой первый вопрос находится в функции validateID: я получаю в бесконечный цикл, когда я пытаюсь проверить первое условие, которое должно убедиться, что первый индекс является характер.
Моя вторая проблема: когда я ввожу имя, идентификатор студента и оценку, программа заканчивается, и я не возвращаюсь к оператору переключения меню, чтобы выбрать другие параметры?
Что я делаю неправильно или что мне не хватает?
Я зацикливаю, если первый символ не является буквенно-цифровым И если число меньше девяти чисел после первой буквы. поэтому, если эти условия не выполняются, цикл должен отображать ошибку и просить пользователя повторно ввести письмо или повторно ввести действительное количество чисел – Rgoat
, как бы я повторно инициализировал флаг в инструкции switch? – Rgoat
Вам нужно сказать компьютеру, чтобы он сделал то, что вы хотите. Ваш дизайн не позволяет делать то, что вы хотите, - я указал, почему ваша программа не работает, вам решать, как это исправить, как программист, поскольку это проблема дизайна, поскольку против конкретной ошибки. – Caleb