C语言在scanf("%s", );中遇到的问题

我是一个小白,在写程序(酒店管理系统)的过程中遇到了关于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("完成登记!");
}

2个回答

可能问题点:
1.Room结构体未初始化;
2.给结构体赋值的时候,参数越界导致赋值到下一个字段中了。比如ID输入20位,就有2位覆盖到name中了。
3.结构体有自动对齐功能,你写的结构体字段很乱,容易导致对齐问题。
4.hotel.bat文件未提供,运行不了

weixin_44322910
OGR 谢答,第一个和第四个是没有问题的,我在同一个文件夹下是有其他函数的,包括对Room结构体的初始化,和Hotel.dat的写入,写进文件的内容用其他函数可以查询到。第三个自动对其的功能我去找了,但也没太看懂,不知道是不是这个问题。第二点提到的越界,一开始我觉得Name的赋值在Id的上面,下面只是给的输出,方便检查问题,应该不会是这个问题,而且我在下面有写语句把输入的Id号钉死在18位,否则直接结束程序。但是我刚刚试着输入超过十八个字符,结果下面的Name是输出了十八位字符之后的字符串!!然后结束。我现在有点懵。
接近 2 年之前 回复

scanf("%s",Room[i].Name);
前面加上
fflush(stdin);

ws1991ws
ws1991ws 可能问题点:1.Room结构体未初始化;2.给结构体赋值的时候,参数越界导致赋值到下一个字段中了。比如ID输入20位,就有2位覆盖到name中了。3.结构体有自动对齐功能,你写的结构体字段很乱,容易导致对齐问题。4.hotel.bat文件未提供,运行不了
接近 2 年之前 回复
zfnmc
zfnmc 我以前遇到过类似情况,输出空字符串,强制转换成字符试试
接近 2 年之前 回复
ws1991ws
ws1991ws 可能问题点:
接近 2 年之前 回复
weixin_44322910
OGR 谢答,但是这在程序里还是没有解决问题。我去查到的fflush(stdin);是说清除缓冲区,然后在以写打开文件的情况下写入文件,但是我的程序在运行的时候会出现第一个printf(在scanf("%s",Room[i].Id);之前)输出的是我输入的字符串,而第二个(在scanf("%s",Room[i].Id);之后)输出却是空格。而且后来写进文件的字符串也是空格。不过我现在还没有试过在接收字符串之后立马写入能不能解决这个问题。
接近 2 年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐