int main()
{
int epilogi,n=1,x,i;
char temp[2];
list=malloc(n*sizeof(struct address));
printf("Lista taxidromikon dieuthinseon\n");
printf("1. Eisagogi stoixeion\n");
printf("2. Diagrafi stoixeion\n");
printf("3. Emfanisi listas\n");
printf("4. Eksodos\n\n");
printf("Epilekste dinontas dinontas ena arithmo apo to 1 eos to 4\n");
while (scanf("%d", &epilogi)!=4)
{
if (epilogi==1)
{
while (strcmp("n",temp))
{
printf("Dose onomateponimo, dieuthinsi, poli, xora kai taxidromiko kodika\n");
fgets(list[n-1].name,80,stdin);
fgets(list[n-1].addr,50,stdin);
fgets(list[n-1].city,50,stdin);
fgets(list[n-1].country,30,stdin);
scanf("%[^\n]%d", &list[n-1].code);
printf("------------------------------------\n");
printf("Thelete na eisagete allo stoixeio?(Pliktrologiste y gia nai n gia oxi)\n");
fgets(temp,2,stdin);
printf("\n");
if (strcmp("n",temp))
{
n=n+1;
list=realloc(list,n*sizeof(struct address));
}
}
[编辑]确定所以我修复了90%的问题。现在程序成功地要求我输入所有6但不输入临时字符串。这是因为最后一次scanf创建的缓冲区中有换行符。如何让fgets忽略它?
答案 0 :(得分:1)
您是否正在使用-Wall
选项进行编译?
这条线
scanf("%d", list[n-1].code);
如果list
是指向struct address
的指针,则会产生警告,因为您应该传递code
的地址。尝试
scanf("%d", &list[n-1].code);
,它对我有用。按照建议,为字符串保留fgets
。
答案 1 :(得分:0)
请勿将scanf()
与fgets()
混合。
建议删除scanf()
来电
要阅读号码,请拨打fgets()
和aoti()
或strtol()
这可以在另一个函数中完成。
int ohyez96_GetInt(int *dest) {
char buf[50];
if (fgets(buf, sizeof buf, stdin) == NULL) return EOF;
// various error checking omitted for now.
*dest = atoti(buf);
return 1;
}
// while (scanf("%d", &epilogi)!=4)
while (ohyez96_GetInt(&epilogi) == 1)
...
// scanf("%[^\n]%d", &list[n-1].code);
if (ohyez96_GetInt(&list[n-1].code) != 1) return -1;