免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2630 | 回复: 4
打印 上一主题 下一主题

[C] 请教如何在C语言中正确处理键盘输入信息(附源程序)。 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2003-08-19 10:24 |只看该作者 |倒序浏览
各位大虾:我在编一个小软件的时候需要用scanf函数接收大量键盘输入的字符串(姓名),但在使用中经常遇到用户输入了一些非法字符,如空格、控制字符、光标回退符等。这些非法字符使前面和后面的输入项变得混乱,以至于不得不退出程序重新运行。用户使用起来一直要小心翼翼地,很不方便。请问有什么办法解决?最好把具体的语句贴出来。 (不好意思,我不懂curses,不然就不用这么费劲了)
源程序如下,请高手指点:
注:
1。由于是改编程序,因此有很多“垃圾”未及清理;
2。水平有限,其中采用了很多笨办法!让各位高手见笑了(千万不要骂我)。

/* 一年定期 李忠良 2003.7 0812 */

#include <stdio.h>;
#include <ctype.h>;
main( )
{
int c,d1,d2,i=0,j=0,err=0,qixian=12;
int en[2000];
long int num0=1,num=1;
long int nump=1201; /* 初始化----网点号 (注意修改) */
float mony,mony2,jishu,jishu2;
static char nowdate[]={"08/13/2003"}; /* 初始化----当前营业日期(注意修改) */
static char enddate[]={"08/13/2003"}; /* 初始化----未存取日(注意修改) */
static char modate0[]={"20030101"}; /* 开户日期默任值 */
static char modate[]={"20030101"};
static char modatey[]={"2003"};
static char modatey2[]={"2003"};
static char modatem[]={"01"};
static char modated[]={"01"};
static char name0[]={"罗大侠aaaaaa"};
char group[5],name[26],ch='a',ch0='a';
char date[10],date0[10],date2[10];
static int numcheck[999];
FILE *fpout;
FILE *fpout1;
strcpy(name0,"罗大侠";
printf(" ***** 屏山县联社门柜数据快速移植程序-一年定期(v0812). *****\n";
printf(" 本程序处理一年定期储蓄\n";
printf(" 编程: 李忠良 \n";
printf(" 2003.7\n\n";

printf("金额最大值为6.2,帐号最大值为99999\n";
printf("当前营业日期:%s\n",nowdate);
printf("未存取日:%s\n",enddate);
printf("当前网点号:%d\n",nump);
printf("请注意检查以上项目,如有误请修改程序!\n";
/* do
{
printf("子科目号(存款期限):",qixian);
scanf("%d",&qixian);
}while( qixian !=12 && qixian!=24 && qixian!=36 && qixian!=60 && qixian !=96 );
*/
printf("请输入组数:";
scanf("%s",group);
if ((fpout=fopen(group,"r")!=NULL)
{
fclose(fpout);
printf("%s组存在未上载数据,请将数据处理后再继续,以免造成混乱!\n",group);
exit(1);
}
else
{
fpout=fopen(group,"w";
printf("新建%s组数据文件!\n",group);
}
fpout1=fopen("tmpfile2","w");
fprintf(fpout1,"%s",group);
fclose(fpout1);
printf("说明:帐号: 0取默认值(上一个号加1) -1退出 -2查阅记录, -帐号重输.\n");
printf(" 姓名 开户日期: 输0或直接回车为取默认值;\n");
printf(" 系统会自动记录上一张单的姓名和日期作为默认值.\n");
printf("注意:余额不能输小数点后两位!只输整数部份,系统自动加上后两位0!\n");

while (num!=-1)
{
do /* 帐号输入和处理 */
{
err=0; /* 重号标志 0 未重 1重 */
printf(" 帐号(%d):",num0);
scanf("%d",&num);
while ( num == -2 ) /* 查阅已输入文本文件 */
{
/* fpout=fopen(group,"r");
ch=fgetc(fpout);
while (ch !=EOF)
{
if ( ch=='|' )
putchar(' ');
else
putchar (ch);
ch=fgetc(fpout);
if ( ch=='\013' )
ch0=getchar();
}
printf("\n");
fclose(fpout); */
system("cut -d'|' -f2,6,10,11,13 `cat tmpfile2` | tr -s '[|]' '[ ]' | more ");
num=0;
printf(" 帐号(%d):",num0);
scanf("%d",&num);
}
while ( num==-1)
{
printf("要上载本组数据吗(1上载 2查看 0退出)?");
scanf("%d",&num);
if (num==1)
{
system("hq.sh `cat tmpfile2`");
exit(1);
}
if (num==2)
system("cut -d'|' -f2,6,10,11,13 `cat tmpfile2` | tr -s '[|]' '[ ]' | more ");
if (num==0)
exit(1);
num=-1;
}
if ( num==0 )
num=num0;
for (i=1;i<=j;i++)
{
if ( num == numcheck | -1*num == numcheck )
if ( num < 0 )
{
printf("\007提示:现在是重输第%d号定单.\n",-num);
num=-1*num;
err=0;
fpout1=fopen("tmpfile1","w");
if ( nump <1000 )
fprintf(fpout1,"0");
if ( num <10 )
fprintf(fpout1,"%d8000000%d",nump,num);
else if ( num <100)
fprintf(fpout1,"%d800000%d",nump,num);
else if (num <1000)
fprintf(fpout1,"%d80000%d",nump,num);
else if (num < 10000)
fprintf(fpout1,"%d8000%d",nump,num);
else if (num < 100000)
fprintf(fpout1,"%d800%d",nump,num);
else
fprintf(fpout1,"%d80%d",nump,num);
fclose(fpout1);
system("grep -v `cat tmpfile1` `cat tmpfile2` >; tmpfile3");
system("cp tmpfile3 `cat tmpfile2`");
break;
}
else
{
printf("\007帐号重号!请检查.\n");
err=1;
break;
}
}
if (num >; 99999 | num < -99999 )
{
num=0;
printf("\007帐号有错,请重输!\n");
err=1;
}
} while ( err == 1 ); /* 帐号处理部分结束 */
j++;
numcheck[j]=num;
if ( num <10 )
printf("%d8000000%d",nump,num);
else if ( num <100)
printf("%d800000%d",nump,num);
else if (num <1000)
printf("%d80000%d",nump,num);
else if (num < 10000)
printf("%d8000%d",nump,num);
else if (num < 100000)
printf("%d800%d",nump,num);
else
printf("%d80%d",nump,num);
printf("\n");
num0=num+1;

strcpy(name,"aaaaaaaaaa");
name[10]='\0';
printf(" 户名(%s):",name0); <--------------这个地方容易出问题,有时输入户名回车后就一
直循环显示“帐号有错,请重输!”只好强行退出。百思不得其解!!
scanf("%s",name);
if ( strcmp(name,"0")==0 )
strcpy(name,name0);
else
strcpy(name0,name);
printf("%s\n",name);

mony=0.0;
mony2=0.0;
printf(" 余额:");
scanf("%f",&mony);
mony2=-1*mony;
printf("%6.2f\n",mony2);

/* printf(" 积数:");
scanf("%f",&jishu);
jishu2=0.01*jishu; */

do
{
printf(" 开户日期(%s):",modate0);
scanf("%s",modate);
if ( strcmp(modate,"0")==0 )
strcpy(modate,modate0);
} while ( strlen(modate) !=8 );
strcpy(modate0,modate);
modatey[0]=modate[0];
modatey[1]=modate[1];
modatey[2]=modate[2];
modatey[3]=modate[3];
modatey[4]='\0';
modatem[0]=modate[4];
modatem[1]=modate[5];
modatem[2]='\0';
modated[0]=modate[6];
modated[1]=modate[7];
modated[2]='\0';
strcpy(modatey2,modatey);
if ( modatey2[3]<'9' ) /* 19xx */
modatey2[3]=modatey2[3]+'\1';
else if ( modatey2[2]<'9' ) /*19x9 */
{
modatey2[2]=modate[2]+'\1';
modatey2[3]='0';
}
else /* 1999 */
{
modatey2[0]='2';
modatey2[1]='0';
modatey2[2]='0';
modatey2[3]='0';
}
printf("%s\n",modate);

fpout=fopen(group,"a");
fprintf(fpout,"%d|",nump);
if ( num <10 )
fprintf(fpout,"%d8000000%d",nump,num);
else if ( num <100)
fprintf(fpout,"%d800000%d",nump,num);
else if (num <1000)
fprintf(fpout,"%d80000%d",nump,num);
else if (num < 10000)
fprintf(fpout,"%d8000%d",nump,num);
else if (num < 100000)
fprintf(fpout,"%d800%d",nump,num);
else
fprintf(fpout,"%d80%d",nump,num);
fprintf(fpout,"|2151|%d|0|%s|0|0|0|",qixian,name);
fprintf(fpout,"%s/%s/%s|",modatem,modated,modatey);
fprintf(fpout,"%s/%s/%s|",modatem,modated,modatey2);
fprintf(fpout,"%s/%s/%s|",modatem,modated,modatey);
fprintf(fpout,"%6.2f|0.0|0|0|0.0|%s|0.0|%s|0|0|0.0|0.0|0|2|2|N|2|2|",mony2,nowdate,group);
fprintf(fpout,"\n");
fclose(fpout);
}
}

论坛徽章:
0
2 [报告]
发表于 2003-08-19 11:50 |只看该作者

请教如何在C语言中正确处理键盘输入信息(附源程序)。

低手建议:用循环getchar取代scanf,对输入的每个ASC2码进行筛选,发现“非法”字符就提示,然后重新开始输入过程。我用了几次scanf,不爽,后来都换getchar了,编程麻烦点,用着舒服。

论坛徽章:
0
3 [报告]
发表于 2003-08-19 17:20 |只看该作者

请教如何在C语言中正确处理键盘输入信息(附源程序)。

请给出你用getchar读取键盘输入的源程序段好吗?输入中文没问题吧?

论坛徽章:
0
4 [报告]
发表于 2003-08-19 19:11 |只看该作者

请教如何在C语言中正确处理键盘输入信息(附源程序)。

代码没有排版,所以没有仔细看。
可以每输入一项就检查一次,如果有误就重复这一项输入。
这个应该用不用getchat都差不多吧

论坛徽章:
0
5 [报告]
发表于 2003-08-21 20:07 |只看该作者

请教如何在C语言中正确处理键盘输入信息(附源程序)。

有没有人给我代码?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP