C语言结构体为什么用gets和puts输入和输出 经常出现错误?

#include"stdio.h"#include<string.h>structdays{intyear;intmonth;intday;};structStudent... #include"stdio.h"
#include<string.h>
struct days{
int year;
int month;
int day;
};
struct Student{
char name[20];
char no[20];
char sex[10];
struct days birthday;
};
main()
{
int i;
struct Student s[2];
for(i=0;i<2;i++)
{
printf("请输入姓名\n");
gets(s[i].name);
printf("请输入学号\n");
gets(s[i].no);
printf("请输入性别\n");
gets(s[i].sex);
printf("请输入生日,并以逗号分开\n");
scanf("%d,%d,%d",&s[i].birthday.year,&s[i].birthday.month,&s[i].birthday.day);
}
for(i=0;i<2;i++)
{
printf("第%d个学生的信息是:\n",i+1);
puts(s[i].name);
puts(s[i].no);
puts(s[i].sex);
printf("%d年%d月%d日\n",s[i].birthday.year,s[i].birthday.month,s[i].birthday.day);
}
}

需不需要清缓存?
展开
 我来答
刀无极啊
推荐于2018-04-12 · TA获得超过3768个赞
知道大有可为答主
回答量:2960
采纳率:85%
帮助的人:954万
展开全部
gets从标准输入设备读字符串函数。可以无限读取,不会判断上限,以回车结束读取,所以程序员应该确保buffer的空间足够大,以便在执行读操作时不发生溢出。本函数可以无限读取,不会判断上限,所以程序员应该确保buffer的空间足够大,以便在执行读操作时不发生溢出。如果溢出,多出来的字符将被写入到堆栈中,这就覆盖了堆栈原先的内容,破坏一个或多个不相关变量的值。这个事实导致gets函数只适用于玩具程序,为了避免这种情况,我们可以用fgets(stdin) (fgets实际上可以读取标准输入(即大多数情况下的键盘输入),具体参阅fgets词条)来替换gets()。在V7的手册(1979年)中说明:为了向后兼容,gets删除换行符,gets并不将换行符存入缓冲区。
pjaxo54
2010-12-16 · TA获得超过3035个赞
知道小有建树答主
回答量:1478
采纳率:0%
帮助的人:876万
展开全部
/*
1.设计一个保存学生情况的结构,学生情况包括姓名、学号、
年龄。输入5个学生的情况,输出学生的平均年龄和年龄最小
的学生的情况。要求输入和输出分别编写独立的输入函数input()
和输出函数output()。
*/

#include <stdio.h>

struct Student {
char name[100]; // 姓名
char stdNo[10]; // 学号
int age; // 年龄
};

// 输入学生信息
void input (Student *stu, int n) {
printf("输入%d个学生信息:", n);

for (int i = 0; i < n; i++) {
printf("\n第%d个学生:\n", i + 1);
printf("姓名:");
gets(stu[i].name);
printf("学号:");
gets(stu[i].stdNo);
printf("年龄:");
scanf("%d", &stu[i].age);
fflush(stdin);
}
}
/*
2.使用结构数组输入10本书的名称和单价,调用函数按照书名
的字母顺序序进行排序,在主函数输出排序结果。
*/

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

struct Book {
char name[100]; // 书名
float price; // 价格
};

// 按书名排序
void sort (Book **pBook, int n) {
for (int i = 0; i < n; i++) {
for (int j = 0; j < n - 1 - i; j ++) {
if (strcmp((*pBook[j]).name, (*pBook[j + 1]).name) == 1) {
Book *temp = pBook[j];
pBook[j] = pBook[j + 1];
pBook[j + 1] = temp;
}
}
}
}

main () {
Book book[10];
Book *prtBook[10];

printf("输入10本书的信息:\n");
for (int i = 0; i < 10; i++) {
printf("\n第%d本书:\n", i + 1);
printf("书名:");
gets(book[i].name);
printf("价格:");
scanf("%f", &book[i].price);
prtBook[i] = &book[i];
fflush(stdin);
}

sort(prtBook, 10);

for (int n = 0; n < 10; n++) {
printf("%s\t\t%0.2f\n", (*prtBook[n]).name, (*prtBook[n]).price);
}
}

/*
3.建立一个有5个结点的单向链表,每个结点包含姓名、年龄和工资。
编写两个函数,一个用于建立链表,另一个用来输出链表。
*/

#include <stdio.h>
#include <malloc.h>

struct Employee {
char name[100]; // 姓名
int age; // 年龄
float salary; // 工资
Employee *next;
};

// 输入员工信息建立链表
Employee * input () {
Employee *head, *ins;

puts("输入5个员工的信息:\n");

head = (Employee *) malloc(sizeof(Employee));
if (head == NULL) {
puts("no enough memory!\n");
return NULL;
}

(*head).next = NULL;
ins = head;
for (int i = 0; i < 5; i++) {
Employee *emp = (Employee *) malloc(sizeof(Employee));
if (emp == NULL) {
puts("no enough memory!\n");
return NULL;
}

printf("\n第%d个员工的姓名:", i + 1);
gets((*emp).name);
printf("第%d个员工的年龄:", i + 1);
scanf("%d", &(*emp).age);
printf("第%d个员工的工资:", i + 1);
scanf("%f", &(*emp).salary);
fflush(stdin);
(*emp).next = NULL; // 为每个字段设置值

// 按照输入的顺序加入的链表中
(*ins).next = emp;
ins = emp;
}
return head;
}

// 输出链表
void output (Employee *p) {
while (p != NULL) {
printf("\n姓名:\t%s\n", (*p).name);
printf("年龄:\t%d\n", (*p).age);
printf("工资:\t%0.1f\n", (*p).salary);

p = (*p).next;
}
}

main () {
Employee *head;

head = input();
if (head == NULL) {
puts("发生错误不能建立链表!");
}

output((*head).next);
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
63278146
2010-12-16 · TA获得超过204个赞
知道小有建树答主
回答量:504
采纳率:100%
帮助的人:195万
展开全部
对的 就是因为你没有用getchar()也就是冲掉回车键
本回答被提问者和网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
a1012144015
2015-05-16 · TA获得超过6415个赞
知道大有可为答主
回答量:9038
采纳率:40%
帮助的人:1359万
展开全部
对的 就是因为你没有用getchar()也就是冲掉回车键
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
jzq740176597
2010-12-16 · TA获得超过301个赞
知道答主
回答量:168
采纳率:0%
帮助的人:192万
展开全部
把源代码给我。这个太笼统啦
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
收起 更多回答(3)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式