C在文件中写入可重复选择的问题

时间:2013-11-25 22:36:14

标签: c arrays string variables structure

好吧,这是我的一半代码,但我有问题,我无法解决它。例如,我需要选择选择2它正在添加一些文件,我输入[姓名,姓氏,日期,性别]按回车和程序显示再次菜单(2.添加到文件)但这次自动选择2选择我需要再次写入数据,并且在选择选择时它会一直发生。请帮我找到这个问题的解决方案。

#include <stdio.h>
#include <string.h>
#include <conio.h>
#include <windows.h>
#define N 15


 struct date
    { int da_year;
      int da_month;
      int da_day;
    };

    struct studenti
    {
      int Nr;
      char name[25];
      char surname[25];
      struct date dzd;
      char dzimums; 
    }students[N] ;


    int main()
    {

    sakums:    

      // FILE *fails_st;
       char line[100];
       char *ptk; char * end; int i;int sorted;
        int g=0,ch,count=0;
        int n;
        int choice;




       FILE *fails_st = fopen("studenti.txt", "r+");
       /* errors ja neizdodas atveert failu  */
        if (fails_st == NULL)
        {
            printf("Error opening file!\n");
            exit(1);
        }




        printf("\n2.Add to file");   
     scanf("%d",&choice); 





if(choice==2){

     /* write in file */     
     for (n=0; n<1; n++)
        {
        printf("%d. Ievadiet: vards, uzvards, datums, dzimums >", n+1);
        scanf("%s",&students[n].name);
        scanf("%s",&students[n].surname);
        scanf("%d.%d.%d",  &students[n].dzd.da_day, &students[n].dzd.da_month,             &students[n].dzd.da_year);
        scanf("%c",&students[n].dzimums);

        }    
    fseek(fails_st, 0, SEEK_END); 
    for (i=0; i<n; i++)
    fprintf(fails_st, " %d. %s %s %d.%d.%d %c\n", N+1, students[i].name, 
              students[i].surname, students[i].dzd.da_day, 
              students[i].dzd.da_month, students[i].dzd.da_year, 
              students[i].dzimums); 

                  fclose(fails_st); 
                  goto sakums; 

    }




       getche();                 
       return 0;

}

1 个答案:

答案 0 :(得分:1)

如果作为第一个参数的格式字符串与可用输入不匹配,scanf很可能无法解决问题。这意味着它不会改变choice的值,因此它仍然是2。

原因可能是您输入的内容与您的格式字符串不匹配。您可以通过检查scanf的返回值来检测何时发生这种情况 - 它将基本上返回写入的变量数。如果它小于格式字符串中的格式说明符数,则会出错。

此时,您可能希望使用所有可用的输入(对于像您这样的简单程序,可能需要int c; do { c = getchar(); } while (c != '\n' && c != EOF);),然后再次提示用户。

特别是,我认为您的scanf("%c", ...)可能是罪魁祸首:%c与大多数scanf说明符不同,不会忽略前导空格,而是接受任何字符。因此,如果您输入&#34;名字姓氏1980.6.11 f&#34;,例如,之前的scanf电话将消耗&#34; 6.11.1980&#34;,留下&#34; F&#34;在输入缓冲区中(注意空格)。然后,带scanf的{​​{1}}会将空格读入性别字段,并保留&#34; f&#34;在输入缓冲区中。接下来,%c将不会做任何事情,因为&#34; f&#34;如果不是有效号码,则scanf("%d",&choice);将保持为2且&#34; f&#34;将被读作下一学生入学的第一个名字,进一步令人困惑的事情......

我认为,解决方案是使用choice显式使用前导空格。