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);
}
}
需不需要清缓存? 展开
#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);
}
}
需不需要清缓存? 展开
5个回答
展开全部
gets从标准输入设备读字符串函数。可以无限读取,不会判断上限,以回车结束读取,所以程序员应该确保buffer的空间足够大,以便在执行读操作时不发生溢出。本函数可以无限读取,不会判断上限,所以程序员应该确保buffer的空间足够大,以便在执行读操作时不发生溢出。如果溢出,多出来的字符将被写入到堆栈中,这就覆盖了堆栈原先的内容,破坏一个或多个不相关变量的值。这个事实导致gets函数只适用于玩具程序,为了避免这种情况,我们可以用fgets(stdin) (fgets实际上可以读取标准输入(即大多数情况下的键盘输入),具体参阅fgets词条)来替换gets()。在V7的手册(1979年)中说明:为了向后兼容,gets删除换行符,gets并不将换行符存入缓冲区。
展开全部
/*
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);
}
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);
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
对的 就是因为你没有用getchar()也就是冲掉回车键
本回答被提问者和网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
对的 就是因为你没有用getchar()也就是冲掉回车键
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
把源代码给我。这个太笼统啦
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询