无法读取所有字符串

时间:2015-01-11 11:54:06

标签: c string scanf fgets

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忽略它?

2 个答案:

答案 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;