关于c语言程序的有关问题,求好心人帮助
关于c语言程序的问题,求好心人帮助
为了方便发帖,我把多个文件合成一个文件发帖
主要问题有2个,
1主程序中
printf("请输入您的操作选项:1、录入;#、退出\n");
为什么会多次多次出现,并如何修改。
2循环数组,赋值时(第2次以上),为什么会把年的部分隐藏掉前3位,如何修改?
代码如下:
------解决方案--------------------
在每个最后不带\n的printf后面加fflush(stdout);
在每个不想受接收缓冲区旧内容影响的scanf前面加rewind(stdin);
另外请检查scanf的返回值。
代码功能归根结底不是别人帮自己看或讲解或注释出来的;而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。
提醒:再牛×的老师也无法代替学生自己领悟和上厕所!
单步调试和设断点调试是程序员必须掌握的技能之一。
------解决方案--------------------
在每个最后不带\n的printf后面加fflush(stdout);
在每个不想受接收缓冲区旧内容影响的scanf前面加rewind(stdin);
另外请检查scanf的返回值。
------解决方案--------------------
带\nprintf底层会自动fflush(stdout);
为了方便发帖,我把多个文件合成一个文件发帖
主要问题有2个,
1主程序中
printf("请输入您的操作选项:1、录入;#、退出\n");
为什么会多次多次出现,并如何修改。
2循环数组,赋值时(第2次以上),为什么会把年的部分隐藏掉前3位,如何修改?
代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
typedef struct date
{
short year;
short month;
short day;
}T_DATE;
typedef struct IndustrialInfo
{
T_DATE m_dDate;
float m_fSpeed;
}_INDUSTRIAL_INFO_;
_INDUSTRIAL_INFO_ DATA[5]={0};
_INDUSTRIAL_INFO_ *p = DATA;
void input();
void save(_INDUSTRIAL_INFO_ *p);
void show2(_INDUSTRIAL_INFO_ *p);
void input()
{
printf("请输入\n 年 月 日 速度\n");
scanf("%d %d %d %f",
&p->m_dDate.year,&p->m_dDate.month,&p->m_dDate.day,&p->m_fSpeed);
save(p);
printf("---------------------------------------------------------------\n");
printf(" 日期 速度 \n");
p = DATA + (p-DATA+1)%2;
show2(p);
printf("---------------------------------------------------------------\n");
}
void save(_INDUSTRIAL_INFO_ *p)
{
FILE *stream;
stream = fopen("machine.txt", "at+");
fprintf(stream, "%4d%02d%02d, %6.2f\n",p->m_dDate.year,p->m_dDate.month,p->m_dDate.day,p->m_fSpeed);
fclose(stream);
}
void show2(_INDUSTRIAL_INFO_ *p)
{
int i;
if (p->m_dDate.year ==0 && p->m_dDate.month ==0 && p->m_dDate.day ==0)
p = DATA;
for (i=0;i<2 && (p->m_dDate.year !=0 || p->m_dDate.month !=0 || p->m_dDate.day !=0 ); i++)
{
printf("%4d年%02d月%02d日, %6.2f M/S\n",p->m_dDate.year,p->m_dDate.month,p->m_dDate.day,p->m_fSpeed);
p = DATA + (p-DATA+1)%2;//通过指针对数组循环赋值,相当于p++移动
}
}
int main(void)
{
char cSel;
do
{
printf("请输入您的操作选项:1、录入;#、退出\n");
scanf("%c", &cSel);
if ('1' == cSel)
input();
} while ('#' != cSel);
return 0;
}
------解决方案--------------------
在每个最后不带\n的printf后面加fflush(stdout);
在每个不想受接收缓冲区旧内容影响的scanf前面加rewind(stdin);
另外请检查scanf的返回值。
代码功能归根结底不是别人帮自己看或讲解或注释出来的;而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。
提醒:再牛×的老师也无法代替学生自己领悟和上厕所!
单步调试和设断点调试是程序员必须掌握的技能之一。
------解决方案--------------------
在每个最后不带\n的printf后面加fflush(stdout);
在每个不想受接收缓冲区旧内容影响的scanf前面加rewind(stdin);
另外请检查scanf的返回值。
------解决方案--------------------
带\nprintf底层会自动fflush(stdout);