为什么fgets在循环中将字符转换为int后跳过输入?

我很好奇为什么fgets在循环中将char转换为int后会跳过输入?我怎样才能解决它

下面是代码:

\include<标准h>
#包括<stdlib.h>
#包括<字符串.h>
坦加拉希尔结构{
int Tanggal;
内布朗;
内塔洪;
};
多森结构{
char NoDosen[255];
char Nama[255];
结构TanggalLahir tgllahir;
};
int main(){
struct Dosen Dosen[5];
char NoDosen[255];
char Nama[255];
int Tanggal;
char Tanggal_街[4];
内布朗;
char Bulan_街[4];
内塔洪;
char Tahun_街[8];
printf(“Pengisian数据文件”);
对于(int i=0;i<2;i++){
printf(“Nomor Dosen:”);
fgets(NoDosen、sizeof(NoDosen)、stdin);
NoDosen[strcspn(NoDosen,"\n")]='\0';
strcpy(dosen[i].NoDosen,NoDosen);
printf(“Nama:”);
fgets(Nama、sizeof(Nama)、stdin);
Nama[strcspn(Nama,“\n””)]='\0';
strcpy(dosen[i].Nama,Nama);
printf(“Tanggal:”);
fgets(Tanggal_街、sizeof(Tanggal_街)、stdin);
Tanggal=strtol(Tanggal_str,NULL,10);
dosen[i].tgllahir.Tanggal=Tanggal;
printf(“布朗”);
fgets(布朗街、sizeof(布朗街)、stdin);
Bulan=strtol(Bulan_str,NULL,10);
dosen[i].tgllahir.Tanggal=Tanggal;
printf(“Tahun:”);
fgets(Tahun_街、sizeof(Tahun_街)、stdin);
Tahun=strtol(Tahun_str,NULL,10);
dosen[i].tgllahir.Tahun=Tahun;
}
printf(“Pengisian data dosen selesai.\n”);
对于(int i=0;i<2;i++){
printf(名称:%s\n,Dosen[i].NoDosen);
printf(“Nama:%s\n”,dosen[i].Nama);
printf(“Tanggal Lahir\n”);
printf(“Tanggal:%d\n”,dosen[i].tgllahir.Tanggal);
printf(“Bulan:%d\n”,dosen[i].tgllahir.Bulan);
printf(“Tahun:%d\n”,dosen[i].tgllahir.Tahun);
}
}

这是因为我使用strtol()函数将字符转换为int吗?如果是,我该如何解决

这是我的终端中的示例输出程序

~/Learning/learn-c
❯ ./数据_dosen
彭吉森资料馆
编号:D1234
纳玛:克里斯纳
汤加:6
布兰:大军:1995年
诺莫·多森:纳马:努纳
汤加:8
布兰:塔亨:1996年
彭吉森数据公司。
编号:D1234
纳玛:克里斯纳
唐格拉格尔
汤加:6
布朗:0
大运:199
诺莫·多森:5
娜玛:努纳
唐加拉希尔
汤加:8
布朗:0
大运:199

如您所见,该字段为“;“布朗”;及;诺莫·多森;被程序跳过。“我期望输入字段是什么”;“布朗”;及;诺莫·多森;不要跳过fgets,因此预期输出程序如下所示:

~/Learning/learn-c
❯ ./数据_dosen
彭吉森资料馆
编号:D1234
纳玛:克里斯纳
汤加:6
布朗:5
大运:1995年
诺莫·多森:D33345
娜玛:努纳
汤加:8
布朗:7
大运:1996年
彭吉森数据公司。
编号:D1234
纳玛:克里斯纳
唐加拉希尔
汤加:6
布朗:5
大运:1995年
诺莫·多森:5
娜玛:努纳
唐加拉希尔
汤加:8
布朗:7
大运:1996年

我很好奇,这是因为我的数据类型;“布朗”;这是不够的,还是别的

非常感谢

你需要把你的弦拉长

char Bulan\u str[4]不够大,无法输入4位数字。它需要足够大以容纳数字、换行符和空终止符

当您调用fgets(Bulan_str,sizeof(Bulan_str),stdin)并键入一个4位数字时,它会将数字的前3个字符读入字符串。输入行的其余部分保留在输入缓冲区中

然后,下次调用fgets(),它将从缓冲区中读取该行的其余部分,因此它不会等待您键入任何内容

因此,将所有输入字符串声明为至少比某人可能输入的最大值大2个字节

发表评论