我是一个小白,在写程序(酒店管理系统)的过程中遇到了关于scanf的问题
在将结构体数组写进文件的过程中有这样几行代码:
printf("姓 名:");
scanf("%s",Room[i].Name);
printf("\n");
printf("请输入身份证号(十八位):");
scanf("%s",Room[i].Id),
printf("客 人:%s",Room[i].Name);
这个时候程序可以顺利运行,但是第一次我输入的名字在程序运行完
scanf("%s",Room[i].Id),
之后,输出的总是空格,这个是在多次调整printf的位置之后发现的。而且写进文件里的也是空格。
12.29.13:20更新_看了一位答主的回答之后我试着输入超出Id限定的字符数,结果在(scanf("%s",Room[i].Id)之后)输出的Room[i].Name却是输出的超出Id限定长度的部分,希望对解决问题有帮助
12.29.18:00更新_刚刚尝试了一下目前为止想到的几种办法。第一种是在接收Room[i].Name之后再接收一个新的,无意义的整型,看看是不是因为连续接收字符串出现的问题,结果还是没有得到想要的结果,这里应该就不是连续接收字符串的问题了。第二种是拿一个字符串数组代替Room[i].Name去接收字符串,再用strcpy( , )复制到Room[i].Name里,结果还是不行。虽然不明白为什么,但是我觉得所有尝试都使得我觉得:scanf("%s",Room[i].Id); 以某种方法改写了Room[i].Name的数据???虽然不明所以,但实际情况是:把 姓名 放到 身份证号 之后接收是可以正常运行,并将正确数据写到文件里面去的。程序算是能运行了,只是脑子还是一团浆糊
12.29.19:05更新_刚刚说的方法操作过后程序确实能运行,但是Room[i].Id接收的字符串的结尾会连接上Room[i].Name,似乎又是一个新问题,但似乎又和前一个问题密切相关......
12.30.0:30更新_程序运行已经解决了,我把 Id 的长度扩大了,可以正确运行了。当时也是注释掉 Id 长度的限定后输入了很短的数,发现能正常运行,然后才这样做出的调整,这样一来发现其实问题应该是出在我在不知道具体规则的情况下把整型直接用字符串数组接收了才导致的。
从提出问题到现在基本解决也多亏大家提出自己的看法,感谢回答,包括评论一楼说到强行转成字符型的那位,不是没有看到你的评论,是我实在是不会转换.........
我有点想不通,到这来向大家求助,希望这个问题能得到解决,谢谢了。
这里贴上完整代码:
#include<stdio.h>
#include<string.h>
#include<conio.h>
#include<stdlib.h>
#include<time.h>
#define SIZE 20
typedef struct tagHotel
{
int Num;
int Check;
char Id[18];
char Name[10];
char Sex[10];
int Age;
int Day;
}Hotel;
Hotel Room[SIZE];
void main()
{
FILE *fp;
int a,i,e,z=0,f=0;
int d,g,j,k,s;
char t[SIZE][18];
int u[4];
time_t timep;
struct tm *p;
time (&timep);
p=gmtime(&timep);
fp=fopen("Hotel.dat","rb+");//---------------------------------fopen
for(i=0;fread(&Room[i],sizeof(Hotel),1,fp)==1;i++);//------------------------------fread
rewind(fp);
for(i=0;i<SIZE;i++)
{
if(Room[i].Check==0)
f++;
}
if(f==0)
{
printf("已经没有空房间了");
exit(0);
}
for(a=0;a==0;a)
{
for(z=0;z<=5;z++)
printf("\n");
for(z=0;z<=2;z++)
printf(" ");
printf("请输入入住房间数:");
scanf("%d",&a);
if(f<a)
{
for(z=0;z<=2;z++)
printf(" ");
printf("房间不够,请修改房间数(按任意键返回)");
a=0;
getch();
system("cls");
}
}
fclose(fp);//------------------------------------------------------------close
for(e=0,i=0;i<SIZE&&e<a;i++)
{
if(Room[i].Check==0)
{
fp=fopen("Hotel.dat","rb+");
system("cls");
fseek(fp,i*sizeof(Hotel),0);
for(z=0;z<=5;z++)
printf("\n");
for(z=0;z<=2;z++)
printf(" ");
printf("请输入顾客信息");
printf("\n\n");
for(z=0;z<=2;z++)
printf(" ");
printf("姓 名:");
scanf("%s",Room[i].Name);
printf("\n");
for(z=0;z<=2;z++)
printf(" ");
printf("请输入身份证号(十八位):");
printf(" ");//-----------------------------------------------
printf("\n客 人:%s",Room[i].Name);//----------------------这里输出的是我的输入字符
printf("\n");//-----------------------------------------------
scanf("%s",Room[i].Id);
printf(" ");//------------------------------------------------------------
printf("\n客 人:%s",Room[i].Name);//-----------------------------------这里输出为空格???
printf("\n");//------------------------------------------------------------
d=strlen(Room[i].Id);
if(d!=18)
{
printf("error\n");
return;
}
strcpy(t[i],Room[i].Id);
for(g=0;g<4;g++)
{
u[g]=t[i][6+g]-48;
}
k=u[0]*1000+u[1]*100+u[2]*10+u[3];
j=(1900+p->tm_year);
printf("\n");
for(z=0;z<=2;z++)
printf(" ");
printf("年龄:%d\n",j-k);
Room[i].Age=j-k;
s=t[i][16]-48+1;
printf("\n");
for(z=0;z<=2;z++)
printf(" ");
//------------------------------------用字符数组存储数字会用ASCII码转换,数字0的ASCII码值为48;
if(s%2==0)
{
printf("性别:男");
strcpy(Room[i].Sex,"男");
}
else
{
printf("性别:女");
strcpy(Room[i].Sex,"女");
}
getch();
system("cls");
printf("\n");
for(z=0;z<=2;z++)
printf(" ");
system("cls");
for(z=0;z<=5;z++)
printf("\n");
for(z=0;z<=2;z++)
printf(" ");
printf("客 人:%s",Room[i].Name);
printf("\n");
for(z=0;z<=2;z++)
printf(" ");
printf("房间号为:%d",Room[i].Num);
Room[i].Check=1;
for(z=0;z<=5;z++)
printf("\n");
for(z=0;z<=2;z++)
printf(" ");
printf("请按任意键确认输入信息");
getch();
system("\n");
fwrite(&Room[i],sizeof(Hotel),1,fp);//-----------------------------------------write
e++;
fclose(fp);//-------------------------------------------------close
}
}
system("cls");
printf("\n\n");
for(z=0;z<=5;z++)
printf("\n");
for(z=0;z<=2;z++)
printf(" ");
printf("完成登记!");
}