gpt4 book ai didi

c - 运行功能后菜单获得默认选项

转载 作者:行者123 更新时间:2023-11-30 16:52:12 26 4
gpt4 key购买 nike

这是我的代码。在菜单中运行第一个选项并插入要求的内容后,将显示菜单,但默认值为“ 0”,这是退出程序的选项。如果选择第二个或第三个选项,则会得到该选项内的printf并再次返回菜单,没有默认值。任何线索为什么会这样?我假装将数据插入选项1,然后使程序与菜单一起运行。

#include <stdio.h>
#include <stdlib.h>

#define LIMIT 30
#define MAX_STUDENTS 60
#define MENU_MIN 0
#define MENU_MAX 6
#define NUM_MIN 2150001
#define NUM_MAX 2169999
#define GRADE_MIN 0
#define GRADE_MAX 20

typedef struct
{
int number;
int finalGrade;
char name[LIMIT];
} tStudent;

int check_insert (int min, int max);
int read_studant_data(tStudent vStudents[MAX_STUDENTS], int numStudents);
void show_studant_data(tStudent vStudents[MAX_STUDENTS], int numStudents);
void change_studante_grade(tStudent vStudents[MAX_STUDENTS], int numStudents);
//void mostrar_estatisticas(tStudent vStudents[], int numStudents);
//void gravar_ficheiro(tStudent vStudents[], int numStudents);
//void ler_ficheiro(tStudent vStudents[], int numStudents);
int menu ();

void main(void)
{
tStudent vStudents[MAX_STUDENTS];
int numStudents = 0;

int option;

do
{
option = menu();
switch(option)
{
case 1:
printf("*Insert data*\n");
read_studant_data(vStudents, numStudents);
break;

case 2:
printf("*Show*\n");
//mostrar_dados_estudante(vStudents, numStudents);
break;

case 3:
printf("*Change final grade*\n");
//alterar_dados_aluno(vStudents, numStudents);
break;

case 4:
printf("**\n");
break;

case 5:
printf("**\n");
break;

case 6:
printf("**\n");
break;

case 0:
printf("Quit");
break;
}
}
while (option != 0);
};

int menu ()
{
int opcao;

do
{
printf("\n1 - Insert data");
printf("\n2 - Show data");
printf("\n3 - Change final grade");
printf("\n4 - ");
printf("\n5 - ");
printf("\n6 - ");
printf("\n0 - Quit\n\n");
printf("Choose an option:\n");

opcao = check_insert(MENU_MIN, MENU_MAX);

printf("\n");
}

while (opcao < MENU_MIN || opcao > MENU_MAX);
return opcao;
};

int check_insert (int min, int max)
{
int insert;

do
{
scanf("%i", &insert);

if ((insert < min) || (insert > max))
{
printf("Value out of range!\n");
printf("Insert a new one\n");
}
else
{
return insert;
}
}
while ((insert < min) || (insert > max));
};

int read_studant_data(tStudent vStudents[MAX_STUDENTS], int numStudents)
{
int numero;
int notaFinal;
char nome[LIMIT];

printf("Students number:\n");
numero = check_insert(NUM_MIN, NUM_MAX);

printf("\nFinal grade to the student:\n");
notaFinal = check_insert(GRADE_MIN, GRADE_MAX);

printf("\nStudents name:\n");
scanf("% [^\n]s", nome);

numStudents++;
printf("%i", numStudents);
};

最佳答案

在菜单中运行第一个选项并插入要求的内容后,显示菜单,但得到的值为“ 0”……


这只是可能的结果之一,因为正如user3629249所指出的那样,在函数check_insert()中,如果对scanf()的调用失败,则变量insert将包含该位置堆栈中每个垃圾的内容。恰好在scanf()运行后,对read_studant_data()的调用失败了,因为user3629249也注意到,scanf("% [^\n]s", nome);是胡说八道。也许您的意思是:scanf(" %[^\n]", nome);-此建议确实可以解决该错误。
失败的原因是,scanf()中格式错误的read_studant_data()不会读取学生的姓名,而是将其保留在标准输入缓冲区中,并将其后的scanf("%i", &insert)保留在check_insert()中(从menu()调用)无法将名称转换为整数。

关于c - 运行功能后菜单获得默认选项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41348600/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com