33,311
社区成员
发帖
与我相关
我的任务
分享
#include<stdio.h>
#include<stdlib.h>
#include<memory.h>
#include<string.h>
#define MAX 40
struct time
{
int hour;
int min;
};
struct order
{
char name[30];
int no;
struct time ortime;
int number;
};
struct order order1[MAX];
int input(void)
{
FILE *or;
int count = 0;
int filecount, index, test, a, test1, test2;
char judge;
int size = sizeof(struct order);
errno_t err;
system("cls");
while ((err=fopen_s(&or,"order.dat", "a+b")) != 0)
{
fputs("Can't creat the file\n", stderr);
system("pause");
exit(1);
}
rewind(or);
while (fread(&order1[count], size, 1, or ) == 1 && order1[count].no != 0)
{
count++;
}
for (filecount = count; filecount < MAX; filecount++)
{
if (count == MAX)
{
printf("The order.dat file is full!\n");
system("pause");
break;
}
system("cls");
do
{
printf("Please enter guest's No.:\n");
a = scanf_s("%d", &order1[filecount].no);
getchar();
test = order1[filecount].no;
if ((test < 1e-6 &&test>40)|| a == 0)
printf("Unexpectable ,please enter a number in range 1-40\n");
} while ((test < 1e-6 &&test>40) || a == 0);
printf("Please enter guest's name:\n");
gets(order1[filecount].name);
do
{
printf("Please enter the number of people:\n");
a = scanf_s("%d", &order1[filecount].number);
getchar();
test = order1[filecount].number;
if ((test < 1e-6 &&test>40) || a == 0)
printf("Unexceptable ,please enter a number in range 1-40\n");
} while ((test < 1e-6 &&test>40) || a == 0);
do
{
printf("Please enter order time(XX,XX):\n");
a=scanf_s("%d,%d", &order1[filecount].ortime.hour, &order1[filecount].ortime.min);
getchar();
test1 = order1[filecount].ortime.hour;
test2 = order1[filecount].ortime.min;
if ((test1 <= 0 || test1>24) || (test2 < 0 || test2>59) || a < 2)
{
printf("Unexceptable ,please enter right time\n");
}
} while ((test1 <= 0 || test1>24) || (test2 < 0 || test2>59) || a < 2);
fwrite(&order1[filecount], size, 1, or );
do
{
printf("Do you want continue?(y/n)\n");
a = scanf_s("%c", &judge);
while (getchar() != '\n')
continue;
if (judge != 'y' && judge != 'n' && judge != 'Y' && judge != 'N')
printf("please try again!\n");
} while (judge != 'y'&&judge != 'n' &&judge != 'Y'&& judge != 'N');
if (judge == 'N' || judge == 'n')
break;
}
fclose(or );
}
int main(void)
{
int a, b, count;
struct order guest[20];
struct order *p;
p = guest;
for (count = 0; count < MAX; count++)
{
order1[count].no = 0;
order1[count].name[40] = '\0';
order1[count].number = 0;
order1[count].ortime.hour = 0;
order1[count].ortime.min = 0;
}
for (;;)
{
system("cls");
printf("----------Welcome To Guest Manager System----------\n");
printf(" MENU \n");
printf("---------------------------------------------------\n");
printf("| 1.Input guests information |\n");
printf("| 2.Sort guests information |\n");
printf("| 3.Read guests information |\n");
printf("| 4.Find guest information |\n");
printf("| 5.Edit guest information |\n");
printf("| 6.Delete guest information |\n");
printf("| 7.Quit |\n");
printf("---------------------------------------------------\n");
for (;;)
{
printf("Please enter the function number: ");
b = scanf_s("%d", &a);
getchar();
printf("\n");
if (b == 0)
printf("Wrong quest!Try again!\n");
else break;
}
switch (a)
{
case 1:input(); break;
case 2:sort(); break;
case 3:read(); break;
case 4:find(); break;
case 5:edit(); break;
case 6:del(); break;
case 7:exit(1); break;
}
}
return 0;
}
while ((err=fopen_s(&or,"order.dat", "a+b")) != 0)
打开文件的方式,有"a+b",我记得有"ab+",没见过"a+b";
order1[count].name[40] = '\0';
这句是不是数组越界访问了,数组长度是30,下标应该从0~29;这儿用40,已经越界。
a = scanf_s("%c", &judge);
scanf_s缺少参数,是不是应该是这样:
a = scanf_s("%c", &judge, 1);