#include <stdio.h>
#include <string.h>

struct student{
    char name[20];
    char studentNumber[5];
    int yearOfBirth;
    float avgPoint;
};

int main(){
    struct student hssv[3];
    int i;
//input info for students, this case its 3 students
    for(i=0; i<3; i++){
        printf("Input element value: ");
        printf("\nInput your name: ");
        fflush(stdin);
        fgets(hssv[i].name, sizeof(hssv[i].name), stdin); //this line doesnt work for the loop
        printf("Input your student code: ");
        fflush(stdin);
        fgets(hssv[i].studentNumber, sizeof(hssv[i].studentNumber), stdin);
        printf("Input your year of birth: ");
        scanf("%d", &hssv[i].yearOfBirth);
        printf("Input your point: ");
        scanf("%f", &hssv[i].avgPoint);
    }
//output info
    for(i=0; i<3; i++){
        printf("\nOutput element value: ");
        printf("\nYour name: %s", hssv[i].name);
        printf("\nInput your student code: %s", hssv[i].studentNumber);
        printf("\nInput your year of birth: %d", hssv[i].yearOfBirth);
        printf("\n\nInput your point: %f", hssv[i].avgPoint);
    }

    return 0;
}

我不知道为什么它不能正常工作,我使用了get(),但随后出现了一个警告,说我应该使用fget().然后我查了一下,并使用了它,但同样的结果一直在发生. FOR NAME的输入对循环中的第二个向前不起作用,我猜是缓冲区溢出?但是我已经在使用fflush()了.请帮帮我...

推荐答案

别用gets().已经被撤回了.

fgets()将在hssv[i].name的末尾停止(这就是获取sizeof(hssv[i].name)的参数的用途).如果用户打字太多,并践踏之后的任何内容,gets()将继续运行.服务器已经以这种方式被征用了.

您的代码无法工作,因为scanf()调用在输入缓冲区中留下了一个换行符.有很多方法可以解决这个问题;我的建议是永远不要使用scanf,而只使用sscanf:

char linebuf[21]; // Reuse for all number reads
// ...
fgets(linebuf, sizeof(linebuf), stdin);
sscanf(linebuf, "%d", &hssv[i].yearOfBirth);

go 掉fflush(stdin);个;它并不总是奏效的.

MOD注意:虽然我们通常会删除谢谢您的 comments ,但在这种情况下,try 这样做会使 comments 帖子变得毫无意义.

C++相关问答推荐

了解一些CLIPS原语数据类型

显式地将值转换为它从函数返回的类型的含义是什么?

如何在C中从函数返回指向数组的指针?

在WSL关闭/重新启动后,是什么原因导致共享对象依赖关系发生更改?

在句子中转换单词的问题

用C语言计算文本文件中的整数个数

一旦运行长度超过2,编译器是否会优化";strnlen(mystring,32)>;2";以停止循环?

C整型和_泛型.哪些类型是兼容的?

如何在不使用字符串的情况下在c中编写函数atof().h>;

C程序向服务器发送TCPRST

如何使这个While循环在新行上结束

将 struct 数组写入二进制文件时发生Valgrind错误

通过对一个大的Malloc内存进行切片来使用Malloc的内存片

GETS()在C++中重复它前面的行

在文件描述符上设置FD_CLOEXEC与将其传递给POSIX_SPOWN_FILE_ACTIONS_ADCLOSE有区别吗?

Leet代码运行时错误:代码不会在Leet代码上编译,而是在其他编译器中编译,如netbeans和在线编译器

C程序printf在getchar while循环后不工作

我可以使用Windows SDK';s IN6_IS_ADDR_LOOPBACK等,尽管没有文档?

x86-64平台上的int_fast8_t大小与int_fast16_t大小

为什么创建局部变量的指针需要过程在堆栈上分配空间?