c语言-C语言,这段代码是什么问题啊?

问题描述

C语言,这段代码是什么问题啊?

#include
#include
#include
typedef struct

{
char name[20];
int age;
}info;
void getinfo(info*pinfo)

{
printf("请输入姓名:n");
gets(pinfo->name);
printf(" 请输入年龄:n");
scanf("%d",&pinfo->age);

}
void main(void)
{
info people[100];
char FileA[50];
printf("保存在哪个文件?n");
gets(FileA);
FILE*fpo=NULL;
fpo=fopen(FileA,"wt");
if(fpo==NULL)
{
printf("输出文件打开失败,请检查n");
exit(0);
}
for (int i=0;i<3;i++)
{
getinfo(&people[i]);
if(fwrite(&people[i],sizeof(info),1,fpo)==0)
{
printf("输出文件打开失败,请检查");
exit(0);
}
}
printf("快写入失败");
fclose(fpo);
getch();
}


在循环的时候,直接跳到输入年龄哪里了?这怎么回事啊.

解决方案

缓冲区没清的问题。gets和scanf肯定都要输入回车作为结束,由于输入年龄时使用的是%d,因此不会将gets输入的回车符读取走,因为类型不匹配,
但是scanf的结束符也没有清除,到了下次循环的时候,结束符依然保存在输入缓冲区内,被gets读取走,因此第二个人之后的姓名都是结束符了

解决方案二:

    printf("请输入姓名:n");
    scanf("%s",&pinfo->name);
    printf("请输入年龄:n");
    scanf("%d",&pinfo->age);

解决方案三:

你所用的gets函数被你输入年龄后的换行符结束了,你可以在每一次输入年龄后加一个getchar函数吃掉换行符就可以了

解决方案四:

gets(pinfo->name)把回车换行当做姓名了。如果不想大改的话,就在前面加一个getchar()

解决方案五:

没事尽量不要用gets,换成getchar

解决方案六:

gets用到读取字符串,用回车结束输入,可以接收空格;而scanf可以读取所有类型的变量,遇到空格、回车和Tab键都会认为输入结束,所有它不能接收空格
scanf :当遇到回车,空格和tab键会自动在字符串后面添加'',但是回车,空格和tab键仍会留在输入的缓冲区中。gets:可接受回车键之前输入的所有字符,并用'n'替代 ''.回车键不会留在输入缓冲区中

解决方案七:

gets用到读取字符串,用回车结束输入,可以接收空格;而scanf可以读取所有类型的变量,遇到空格、回车和Tab键都会认为输入结束,所有它不能接收空格

解决方案八:

统一改成 scanf,或者 gets + getchar
这个问题的原因中不同的输入函数,对回车的响应不同。

时间: 2025-01-13 22:15:50

c语言-C语言,这段代码是什么问题啊?的相关文章

c语言程序问题,求一段代码

问题描述 c语言程序问题,求一段代码 求一段c语言代码:有一个已排好序的数组,要求输入一个数后,按原来排序的规律将其插入数组中 解决方案 #include<iostream> #include<iomanip> using namespace std; int main() { int i; cout<<"原来数列为:"<<endl; int a[11]={1,2,3,5,6,7,8,9,10,11}; for(i=0;i<=8;i

图片-刚学c语言,各位大大帮我看看这段代码哪里有错,谢谢啦

问题描述 刚学c语言,各位大大帮我看看这段代码哪里有错,谢谢啦 题目是判断一个数是否能被3整除 解决方案 第一,主函数里调用函数方法即可,不可以定义函数:第二,你的函数名不规范,一般很少用一个单字母表示函数,当然f除外(习惯不好),可以命名为Divide_3.第三,返回值最好用宏定义设计为True或者False,逻辑更清晰. 解决方案二: main函数中调用x()函数#include int main(){x(s);}int x(int s){....} 解决方案三: 这个太基础了,你应该多看点

r语言-请大家看看我这段代码有啥问题,为什么会提示“更换参数长度为零”?

问题描述 请大家看看我这段代码有啥问题,为什么会提示"更换参数长度为零"? pse=rep(0,Iter) psa=rep(0,Iter) for (j in c(1:Iter)) { P=rep(0, T) for (i in c(1:T)) { n=rnorm(1,0,1) temp = exp(r-0.5*(s)^2 + s*n) if(i>=2) P= P[i-1] * temp if(i==1) P=initPrice*temp } pse[j]=P[T] psa[j]

链表-请教:(C语言学生信息管理)程序函数里好像直接跳过了某一段代码执行

问题描述 请教:(C语言学生信息管理)程序函数里好像直接跳过了某一段代码执行 void Student_Searchself(STUDENT *head) //此函数是为了显示学生的各科成绩和各科排名 //(head)存储学生成绩的链表头指针{STUDENT *p*m*e*y*l;STUDENT *p1*p2*p3*p4;char s[6];system(""cls"");printf(""请输入本人学号来查找n"");sca

VB编程 及EXCEL 的VBA编程,用什么把一段代码括起来啊(就是用什么东西来实现C语言中的{}功能啊)?

问题描述 VB编程及EXCEL的VBA编程,用什么把一段代码括起来啊(就是用什么东西来实现C语言中的{}功能啊)? 解决方案 解决方案二:不是有begin和end吗解决方案三:region?C的{}有很多啊,只能你VB书都没看过if...endif-------------if{}for...endfor---------for{}解决方案四:for..next.............我草解决方案五:学c的时候用按键精灵的时候我也愣了一阵子...很多是用end,if之后用endif,while

编程语言-我要用C++实现这段代码 求大神帮解释下R语言代码的意思

问题描述 我要用C++实现这段代码 求大神帮解释下R语言代码的意思 OrgData=read.csv("DownlinkPower_train.csv",header=T) TestData=read.csv("DownlinkPower_test.csv",header=T) #remove abnormal data, optional //移除异常数据 OrgData = subset(OrgData, OrgData[,1] > 0) TestData

C语言udp协议,局域网下,这两段代码为什么不能通讯?

问题描述 C语言udp协议,局域网下,这两段代码为什么不能通讯? client.c 发送消息 #include<stdio.h> #include<sys/types.h> #include<sys/socket.h> #include<netinet/in.h> #include<arpa/inet.h> #include<errno.h> #include<unistd.h> #include<sys/wait.

library-下面这段代码是什么语言,用什么工具打包成dll?

问题描述 下面这段代码是什么语言,用什么工具打包成dll? 下面这段代码是什么语言,用什么工具打包成dll? library DSounds; { Important note about DLL memory management: ShareMem must be the first unit in your library's USES clause AND your project's (select Project-View Source) USES clause if your DL

c语言的一段代码不会,请大神帮忙

问题描述 c语言的一段代码不会,请大神帮忙 2C 无向带权图 解决方案 http://download.csdn.net/detail/zhangjinfu110/4575505 解决方案二: 图片太小了,看不清啊