Arrays 当我运行程序时,fgets()被忽略,scanf()不';t将数据输入到结构
当我运行它时,fgets()被忽略,scanf()不向结构输入数据 我的代码:Arrays 当我运行程序时,fgets()被忽略,scanf()不';t将数据输入到结构,arrays,gcc,structure,scanf,fgets,Arrays,Gcc,Structure,Scanf,Fgets,当我运行它时,fgets()被忽略,scanf()不向结构输入数据 我的代码: #include"stdio.h" #include"stdlib.h" typedef struct { char nazv[50]; int numr; int date[3]; int time[2]; } train; void input(train*rasp,int n); void print(train*rasp,int n); void output(train*rasp, in
#include"stdio.h"
#include"stdlib.h"
typedef struct {
char nazv[50];
int numr;
int date[3];
int time[2];
} train;
void input(train*rasp,int n);
void print(train*rasp,int n);
void output(train*rasp, int n, int*date, int*time);
main() {
int n;
int t[2];
int d[3];
printf("How much? ");
scanf("%d",&n);
train* rasp=(train*)malloc(n*sizeof(train));
input(rasp,n);
printf("Enter date: ");
for (int date=0;date<3;date++) {
scanf("%d",&d[date]);
}
printf("Enter time: ");
for (int time=0;time<2;time++) {
scanf("%d",&t[time]);
}
for (int i=0;i<n;i++)
print(rasp,n);
output(rasp,n,d,t);
free(rasp);
return 0;
}
void input(train*rasp,int n) {
for (int i=0;i<n;i++) {
printf("Train #%d\n",i+1);
printf("Enter train's name: ");
fgets(rasp[i].nazv,50,stdin);
printf("Enter train's number: ");
scanf("%d",&rasp[i].numr);
printf("Enter date: ");
for (int d=0;d<3;d++) {
scanf("%d",&rasp[i].date[d]);
}
printf("Enter time: ");
for (int t=0;t<2;t++) {
scanf("%d",&rasp[i].time[t]);
}
}
printf("\nOK.");
}
void print(train*rasp,int n) {
printf("Name: ");
printf("%s",rasp[n].nazv);
printf("\nNumber: %d",rasp[n].numr);
printf("\nDate: %d.%d.%d", rasp[n].date[0],rasp[n].date[1],rasp[n].date[2]);
printf("\nTime: %d:%d\n", rasp[n].time[0],rasp[n].time);
}
void output(train*rasp,int n,int*date,int*time) {
for (int i=0;i<n;i++) {
if (rasp[n].date[2]<date[2])
continue;
if (rasp[n].date[2]>date[2]) {
print(rasp,n);
} else {
if (rasp[n].date[1]<date[1])
continue;
if (rasp[n].date[1]>date[1]) {
print(rasp,n);
} else {
if (rasp[n].date[0]<date[0])
continue;
if (rasp[n].date[0]>date[0]) {
print(rasp,n);
} else {
if (rasp[n].time[0]<time[0])
continue;
if (rasp[n].time[0]>time[0]) {
print(rasp,n);
} else {
if (rasp[n].time[1]<=time[1])
continue;
print(rasp,n);
}
}
}
}
}
}
#包括“stdio.h”
#包括“stdlib.h”
类型定义结构{
char-nazv[50];
int numr;
国际日期[3];
整数时间[2];
}训练;
无效输入(序列*锉刀,整数n);
无效打印(序列*锉刀,整数n);
无效输出(序列*锉刀,整数n,整数*日期,整数*时间);
main(){
int n;
int t[2];
int d[3];
printf(“多少钱?”);
scanf(“%d”和“&n”);
序列*锉刀=(序列*)malloc(n*sizeof(序列));
输入(锉刀,n);
printf(“输入日期:”);
对于(int date=0;date)
scanf
将向程序发送输入的换行保留在输入缓冲区中
train* rasp=(train*)malloc(n*sizeof(train));
input(rasp,n);
void input(train*rasp,int n) {
for (int i=0;i<n;i++) {
printf("Train #%d\n",i+1);
printf("Enter train's name: ");
fgets(rasp[i].nazv,50,stdin);
printf("Enter train's number: ");
scanf("%d",&rasp[i].numr);
哪个scanf
无法转换为int
由于换行符行为不同,混合使用scanf
和fgets
进行用户输入很容易出错。除非清除scanf
和后续fgets
之间的输入缓冲区,否则fgets
通常只会从scanf
中得到换行符(有一些scanf
格式使用换行符)
您可以清除缓冲区
void clear_input_buffer(void) {
int c;
while((c = getchar()) != EOF && c != '\n');
if (c == EOF) {
// input stream broken, what now?
exit(EXIT_FAILURE);
}
}
或者对所有输入使用fgets
,并使用sscanf
(以及strtol
和friends)来解析输入。1)\include“stdio.h”
应该是\include
2)不要强制转换malloc()的返回值3)添加一些空格以提高可读性。4)您的output()函数几乎不可读。
void clear_input_buffer(void) {
int c;
while((c = getchar()) != EOF && c != '\n');
if (c == EOF) {
// input stream broken, what now?
exit(EXIT_FAILURE);
}
}