Micokery九九 2021-12-24 19:59 采纳率: 91.7%
浏览 41
已结题

请问这个程序里面的“清空上次输入”,“是否包含字符串”应该怎样理解,它们是怎样实现作用的 求具体的分析过程

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
//重要程度
enum ELevel
{
e_level_high,
e_level_mid,
e_level_low
};
//定义日志信息
struct DataInfo
{
char tt[20];
char data[100];
enum ELevel level;
};
struct DataInfo g_all[200]; //定义全局变量存储信息
int g_nmb=0; //日志的实际数量
int login()
{
char user[]="zhangsan";
char password[]="123";
char un[30],pwd[30];
int tms=0;
printf("请输入用户名:");
while(tms <3)
{
scanf("%s",un);
if(strcmp(un,user)==0)
break;
else
{
tms++;
if(tms==3)
{
printf("输入错误超过3次,退出程序");
system("pause");
return 0;
}
else
printf("用户名输入错误,请重新输入:");
}
}
tms = 0;
printf("请输入密码:");
while(tms <3)
{
scanf("%s",pwd);
if(strcmp(pwd,password)==0)
break;
else
{
tms++;
if(tms==3)
{
printf("输入错误超过3次,退出程序");
system("pause");
return 0;
}
else
printf("用户名输入错误,请重新输入:");
}
}
printf("欢迎使用本系统!\n");
system("pause");
return 1;
}
//菜单
int menu()
{
int opt;
system("cls"); //清屏
printf("1.新增记录\n");
printf("2.输出所有信息\n");
printf("3.删除指定信息\n");
printf("4.退出系统\n");
printf("请输入您的选择:");
scanf("%d",&opt);
return opt;
}
void gettmstr(char now_date[])
{
time_t rawtime;
struct tm * timeinfo;
time ( &rawtime );
timeinfo = localtime ( &rawtime );
sprintf(now_date,"%04d-%02d-%02d %02d:%02d:%02d",(1900+timeinfo->tm_year),(1+timeinfo->tm_mon),
timeinfo->tm_mday,timeinfo->tm_hour,timeinfo->tm_min,timeinfo->tm_sec);
now_date[19] = 0;
}
//清空输入缓存
void safe_flush(FILE *fp)
{
int ch;
while( (ch = fgetc(fp)) != EOF && ch != '\n' );
}
//插入数据
void insertData()
{
struct DataInfo dt;
int level;
system("cls");
gettmstr(dt.tt);
printf("请输入需要插入的内容:");
safe_flush(stdin); //清空输入缓存
gets(dt.data);
printf("请选择日志等级:(2:高 1:中 0:低)");
while(1)
{
scanf("%d",&level);
if(level>=0 && level<=2)
break;
else
printf("请输入0-2之间的数:");
}
if(level == 2)
dt.level = e_level_high;
else if(level == 1)
dt.level = e_level_mid;
else
dt.level = e_level_low;
g_all[g_nmb++] = dt;
printf("插入成功\n");
system("pause");
}
//显示全部数据
void showAll()
{
int i=0;
system("cls");
printf("日期 等级 内容\n");
for (i=0;i<g_nmb;i++)
{
printf("%s ",g_all[i].tt);
if(g_all[i].level == e_level_high)
printf("高 ");
else if (g_all[i].level == e_level_mid)
printf("中 ");
else
printf("低 ");
printf("%s\n",g_all[i].data);
}
system("pause");
}
//是否包含字符串
int findstr(char*big ,char* smal)
{
int i,j,lenb,lens;
int nmb = 0;
lenb = strlen(big);
lens = strlen(smal);
nmb = 0;
if(lens > lenb)
return 0;
i = 0;
while(i < lenb-lens+1)
{
for (j = 0; j < lens;j++)
{
if(big[i+j] != smal[j])
break;
}
if (j == lens) //说明找到
{
nmb++;
return 1;
i += lens;
}else
i++;
}
return 0;
}
//删除指定数据
void del()
{
char buf[100]={0};
char tt[20]={0};
int i,j,k,nmb=0,op=0;
system("cls");
printf("请输入需要删除的日志日期(如:2021-02-03 20:00、2021-02-03 20、2021-02-03):");
gets(tt);
safe_flush(stdin);
printf("满足条件的记录有:\n");
//输出所有符合要求的数据
for (i=0;i<g_nmb;i++)
{
if(findstr(g_all[i].tt,tt))
{
nmb++;
printf("(%d) ",nmb);
printf("%s ",g_all[i].tt);
if(g_all[i].level == e_level_high)
printf("高 ");
else if (g_all[i].level == e_level_mid)
printf("中 ");
else
printf("低 ");
printf("%s\n",g_all[i].data);
}
}
if(nmb == 0)
{
printf("未找到改日期的日志");
system("pause");
return ;
}
printf("请输入需要删除的日志序号:");
while(1)
{
scanf("%d",&op);
if(op >=1 && op <= nmb)
break;
else
printf("未找到该序号的日志,请重新输入:");
}
//删除
k=0;
for (i=0;i<g_nmb;i++)
{
if(findstr(g_all[i].tt,tt))
{
k++;
if(k == op)
{
for(j=i;j<g_nmb-1;j++)
g_all[j] = g_all[j+1];
g_nmb -=1;
printf("删除成功!\n");
break;
}
}
}
system("pause");
}
//处理登录后的事物
void deal()
{
int opt;
while(1)
{
opt = menu();
switch(opt)
{
case 1:
insertData();
break;
case 2:
showAll();
break;
case 3:
del();
break;
case 4:
printf("谢谢使用,再见!\n");
system("pause");
return ;
}
}
}
int main()
{
int opt;
printf("--------------------------------\n");
printf(" 欢迎使用记事本系统 \n");
printf(" 1.登录 \n");
printf(" 2.退出 \n");
printf("--------------------------------\n");
printf("请输入您的选择:");
scanf("%d",&opt);
switch(opt)
{
case 1:
if(login())
deal();
break;
case 2:
printf("谢谢使用,再见!\n");
system("pause");
return 0;
}
return 0;
}

  • 写回答

2条回答 默认 最新

  • CSDN专家-Time 2021-12-24 20:07
    关注

    img


    gets函数详细解释
    http://www.cplusplus.com/reference/cstdio/gets/
    scanf函数详细解释

    img


    出现这个问题的原因还是 gets和 scanf混用导致的。
    因为scanf会扫描\n之前的所有数据
    如果此时在后面跟了一个gets
    你的程序不会执行输入,而是将scanf中的数据直接拷给gets函数中的数组

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 1月2日
  • 已采纳回答 12月25日
  • 创建了问题 12月24日

悬赏问题

  • ¥15 R语言Rstudio突然无法启动
  • ¥15 关于#matlab#的问题:提取2个图像的变量作为另外一个图像像元的移动量,计算新的位置创建新的图像并提取第二个图像的变量到新的图像
  • ¥15 改算法,照着压缩包里边,参考其他代码封装的格式 写到main函数里
  • ¥15 用windows做服务的同志有吗
  • ¥60 求一个简单的网页(标签-安全|关键词-上传)
  • ¥35 lstm时间序列共享单车预测,loss值优化,参数优化算法
  • ¥15 Python中的request,如何使用ssr节点,通过代理requests网页。本人在泰国,需要用大陆ip才能玩网页游戏,合法合规。
  • ¥100 为什么这个恒流源电路不能恒流?
  • ¥15 有偿求跨组件数据流路径图
  • ¥15 写一个方法checkPerson,入参实体类Person,出参布尔值