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

#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);
}
}

需不需要清缓存?

gets从标准输入设备读字符串函数。可以无限读取,不会判断上限,以回车结束读取,所以程序员应该确保buffer的空间足够大,以便在执行读操作时不发生溢出。本函数可以无限读取,不会判断上限,所以程序员应该确保buffer的空间足够大,以便在执行读操作时不发生溢出。如果溢出,多出来的字符将被写入到堆栈中,这就覆盖了堆栈原先的内容,破坏一个或多个不相关变量的值。这个事实导致gets函数只适用于玩具程序,为了避免这种情况,我们可以用fgets(stdin) (fgets实际上可以读取标准输入(即大多数情况下的键盘输入),具体参阅fgets词条)来替换gets()。在V7的手册(1979年)中说明:为了向后兼容,gets删除换行符,gets并不将换行符存入缓冲区。
温馨提示:内容为网友见解,仅供参考
第1个回答  2010-12-16
/*
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);
}
第2个回答  2010-12-16
对的 就是因为你没有用getchar()也就是冲掉回车键本回答被提问者和网友采纳
第3个回答  2015-05-16
对的 就是因为你没有用getchar()也就是冲掉回车键
第4个回答  2010-12-16
把源代码给我。这个太笼统啦

C语言结构体为什么用gets和puts输入和输出 经常出现错误?
gets从标准输入设备读字符串函数。可以无限读取,不会判断上限,以回车结束读取,所以程序员应该确保buffer的空间足够大,以便在执行读操作时不发生溢出。本函数可以无限读取,不会判断上限,所以程序员应该确保buffer的空间足够大,以便在执行读操作时不发生溢出。如果溢出,多出来的字符将被写入到堆栈中,这...

C语言puts函数好gets函数的调用问题:为什么通过Menu()函数调用的puts...
fflush(stdin);其次是,函数 Prove_copy() 未定义,我定义了一个空的。修改后如下:void Prove_string(){ char str[20];printf("请输入长度少于20的字符串:\\n");\/\/ 清空输入缓冲区 fflush(stdin);gets(str);printf("你输入的子符为:\\n");puts(str);}\/\/\/问题:为什么Menu菜单函数调用时会...

C语言为什么gets函数输出乱码
puts的参数是字符串,不是int型数组

c语言新手上路,求教一下为什么我这个输入字符串的时候用scanf运行出来...
第一,你说的正确情况应该是gets,而不是get 第二,scanf和gets区别在于,gets输入整行,而scanf遇到空白字符就会停止 所以应该你的输入中有空格一类的需要存入数组的空白字符,导致scanf读取非预期 so,确认一下输入是不是有我说的这种情况,如果有,那就用gets吧,挺好用的。没必要一定用scanf(scanf...

...前两个用%S输入,后两个用gets()输入,用puts()输出……
函数输入字符串时存在一个问题, 就是如果输入了空格会认为输入字符串结束,空格后的字符将作为下一个输入项处理, 但gets() 函数将接收输入的整个字符 串直到回车为止。gets(s)函数中的变量s为一字符串。如果为单个字符, 编译连接不会 有错误, 但运行后会出现"Null pointer asignmemt"的错误。include...

c语言scanf gets问题
scanf的%s格式接收字符串时,以空格或回车作为终止符。而gets只以回车作为终止符。你这里s1==aaa s2==bbb s3=ccc ddd所以输出会这样 puts输完最后输出'\\n',就是换行

一个关于puts();和gets()的函数的问题
你的C只有3个字节,你使用了abcdefghi10个字节,不出错真是奇迹。函数原型:char*gets(char*buffer);使用的buffer是个内存地址,二维数组也是内存地址,所以他们也可用在二维中。但是这样用很容易计算错误,如果数学非常好,可以使用。书上的意思是输入2个是安全的,2个以上是不安全的。

c语言if里用gets,求帮忙,简单的题瞅了一个上午没看出来……
读入z的时候没有把回车符读掉,造成a会读到空串。下面这样就行了。include "stdio.h"include "string.h"include "math.h"int main(){int z;char a[10],b[10];scanf("%d\\n",&z);if(z%2==0){gets(a);gets(b);puts(strcat(a,b));} else printf("sad");} ...

c语言中gets()和puts()的问题
但是你使用的时候最好还是不要超出你自己申请的空间,不然很可能会破坏它的数据结构!!所以能输进去很正常!!字符串输出的话要是不遇到'\\0'是不会停止的,你试试给abc[0]赋一个值,用puts(abc)应该照样会输出好多东西!!所以要把char数组当字符串输出的话,最好要在数组的结尾处加个'\\0'...

c语言的gets函数编译不成功阿,很短的程序
编译问题。这个是一个警告。我记得以前有看过,是说,gets没有限制输入字符的长度,你的数组a是100字节,如果输入101字节会溢出。只是建议你少用,用别的替代。

相似回答