无法将用户输入保存到变量中

时间:2016-04-20 16:27:45

标签: c function insert

大家好,我正在做作业,但我遇到了一些问题。

这是我的变数:

struct student
{
    int facN;
    char name[MAX_LENGHT + 1];
    char prezime[MAX_LENGHT + 1];
    char familiq[MAX_LENGHT + 1];
    char specialnost[MAX_LENGHT + 1];
    int group;
    int kurs;
};
typedef struct student BODY;

输入的功能是:

int enterBody(BODY *ps)
{
    if (ps == NULL) return 0;
    memset(ps, 0, sizeof(BODY));

    fflush(stdin);
    printf("\nFaculty No: ");
    scanf("%d", &(ps->facN));
    //fflush(stdin);

    printf("\nName: ");
    gets(ps->name);

    printf("\nPrezime: ");
    gets(ps->prezime);

    printf("\nFamiliq: ");
    gets(ps->familiq);

    printf("\nSpecialnost: ");
    gets(ps->specialnost);

    printf("\ngrupa: ");
    gets(ps->group);

    printf("\kurs: ");
    gets(ps->kurs);

    return 1;
}

主要问题是当我运行程序时,我无法获得Prezime,其他人在此之后进入屏幕,之后将输入保存到变量中。

1 个答案:

答案 0 :(得分:0)

  1. fflush(stdin);调用未定义的行为,因此您应该删除这些语句。
  2. memset()结构没有意义,因为它最终会被数据填充。
  3. 使用scanf(" %d%*c", &var);而不是gets()输入int字段。添加了%*c以丢弃'\n'个字符。
  4. gets()没有缓冲区溢出保护,因此请调用fgets()。另外,使用strcspn()删除'\n'撰写的拖尾fgets()
  5. 我想你的意思是printf("\nkurs: ");
  6. 精炼代码:

    int enterBody(BODY *ps)
    {
        if (ps == NULL)
            return 0;
    
        printf("\nFaculty No: ");
        scanf(" %d%*c", &ps->facN);
    
        printf("\nName: ");
        fgets(ps->name, MAX_LENGHT + 1, stdin);
        (ps->name)[strcspn((ps->name), "\n")] = '\0';
    
        printf("\nPrezime: ");
        fgets(ps->prezume, MAX_LENGHT + 1, stdin);
        (ps->prezume)[strcspn((ps->prezume), "\n")] = '\0';
    
        printf("\nFamiliq: ");
        fgets(ps->familiq, MAX_LENGHT + 1, stdin);
        (ps->familiq)[strcspn((ps->familiq), "\n")] = '\0';
    
        printf("\nSpecialnost: ");
        fgets(ps->specialnost, MAX_LENGHT + 1, stdin);
        (ps->specialnost)[strcspn((ps->specialnost), "\n")] = '\0';
    
        printf("\ngrupa: ");
        scanf(" %d%*c", &ps->group);
    
        printf("\nkurs: ");
        scanf(" %d%*c", &ps->kurs);
    
        return 1;
    }