⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cyhs.c

📁 这是一个在 unix 系统下使用的常用输入界面处理、字段处理、屏幕数据打印等函数。
💻 C
字号:
#define OK 1#define YES 1#define NO 0#define  ABS(x)  ((x)>0 ? (x) : -(x))/*//////////////////////////////////////////////////////////////// 一组对屏幕确认结果进行处理的函数, 可以对屏幕上的给出确认 //// 回答的问题返回'1', 其它回答返回'0'. 同时程序中接收调用程 //// 序的提示信息.                                            ////////////////////////////////////////////////////////////////*/quest(x,y,QuestStr)int x,y;char *QuestStr;{  char c,k;  char buf[80];  MV(x,y);  sprintf(buf,"\07%s吗? (Y/N):[ ]\n",QuestStr);  write(1,buf,strlen(buf));  k = y+strlen(buf)-4;  MV(x,k); read(0,&c,1); write(1,&c,1);  while(!isin(c,"YyNn01")){    bell(1); MV(x,k);    read(0,&c,1);     write(1,&c,1);  }   switch(c){    case '1': case 'y': case 'Y':      return(OK);    case '0': case 'n': case 'N': case '\0':      return(NO);    default :      bell(1);       return(NO);    }}NField(inStr, FiledChar, Num, outStr)char  *inStr, FiledChar, *outStr;int   Num;{  while( *inStr  &&  Num ){     *outStr ++ = *inStr ++;     if(*inStr==FiledChar) Num --;   }   *outStr ++= FiledChar;   *outStr ='\0';   return 0;}field(N,inS,outS,FleldChar)int N;char FleldChar,inS[],outS[];{  int i,j,MaxN;  i=j=MaxN=0;  while(inS[i] && inS[i]!='\n'){    if(inS[i]==FleldChar)MaxN++;      i++;      }                   /* 计算inS的字段总数 */  if(N>MaxN){      outS[0]=0; return(0);      }                   /* 对输入字段个数N值进行判断 */  i=0;  while(N && inS[i] && inS[i]!='\n' ){    if(inS[i]==FleldChar)N--;    i++;  } /* 计算第N个字段在inS中的开始位置 */  while(inS[i] && inS[i]!=FleldChar && inS[i]!='\n' ) outS[j++]=inS[i++];  outS[j]=0; /* 从inS中取出第N个字段存放于outS中 */  return(j);  /* 返回当前字段的长度 */}/*  将buf中的内容分解, 存放在SubStr子字符串中, 由一个输入字符串可以得到  一组数据分解结果, 程序在使用的时候, 必须传入该字符串数组的最大存  储空间, 这时系统进行工作的一个前提. */SplitBUF(buf, SubStr, dimch, Maxnu, Maxlen)char  *buf, *SubStr, dimch;int Maxnu, Maxlen;{  int pdn, pc;  /*  pdn--当前成功转换的字符串的位置数, pc--在一个输出字符串中的位置值.  */    pc=pdn=0;  while( *buf && *buf != '\n' && pdn < Maxnu ){    if(*buf== dimch) {      SubStr[Maxlen*pdn + pc]='\0';      pdn ++; pc=0;      }    else {      SubStr[Maxlen*pdn +pc] = *buf;      pc++;    }    buf ++;  }  for(; pdn < Maxnu ; pdn++) SubStr[Maxlen*pdn]='\0';}/*********************************************************************// 对文件Fname进行处理, 在in1位置搜索字符串inS, 在确认搜索成功的时候,// 将in2位置的字符串输出到outS中, 是一个可以对文件进行智能化处理的函数.// 每次进行数据处理时, 函数所需要处理的inS字段需要是文件中的一个索引// 字段, 如果进行处理的字段比较多, 就需要保持文件中有多个inS索引, 而// 输出结果字段outS可以在行的任意位置, 这是一个使用灵活的数据搜索函数.// 其中chs 是程序在进行数据处理时的数据分割符号.*********************************************************************/Find_NVal(Fname, in1, inS, in2, outS, chs)char  *Fname, *inS, *outS, chs;int in1, in2;{  FILE *fp;  int  flag=0, len;  char buf[128], str[4][32];  len = strlen(inS);  fp = fopen(Fname, "r");  if(fp==NULL) return -1;  while(fgets(buf, 100, fp)){    field(in1, buf, str[1], chs);    if(!strncmp(inS, str[1], len)){      field(in2, buf, outS, chs);      flag = 1;      break;    }  }  fclose(fp);  return flag;}/***************************************************************// 一些需要与ESQL/C  混合编程的函数,需要与ESQL语言连接编译。// 可以对一个字符串的尾部空格进行处理的程序。****************************************************************/trim(Str)char Str[];{    int len;   len=strlen(Str);   while (len>0 && Str[len-1]==' ') --len;   Str[len]='\0';   return(strlen(Str));}isin(c, Str)char c, *Str;/*// isin() 可以判断一个字符在一个字符串中的存在性.// 如果字符存在程序返回1, 否则返回0.*/{  while(*Str){    if(c==*Str)return(YES);    Str++;    }  return(NO);}/* 判断一个字符串中的那个字符在另一个参考串中存在. */ISstrin(str, buf)char *str, *buf;{  while(*str){    if(isin(*str, buf)) return(YES);    str ++;   }   return(NO);}/*// //////////////////////////////////////////////////  一组屏幕处理的函数, 这组函数可以完成各种屏幕 ////  任务的处理工作.                              //// ////////////////////////////////////////////////*/SBR(){  char buf[32];  sprintf(buf, "\033[7m");  write(1, buf, strlen(buf));  fflush(stdout);}/*// 开始反显处理.*/CBR(){  char buf[32];  sprintf(buf, "\033[0m");  write(1,buf, strlen(buf));  fflush(stdout);}/*// 结束反显处理.*//*// 鸣笛N秒函数, 可以根据用户的需要持续在终端上鸣笛.*/bell(n)int n;{  while(n-- >0 )write(1,"\07",1);  fflush(stdout);  return 0;}/*// 终端屏幕清理函数, 可以将屏幕上的显示内容清理, 同时将// 光标移动在屏幕的最左上角.*/clean(){  char buf[32];  strcpy(buf, "\033[2J\n\033[1;1H");  write(1, buf, strlen(buf));  fflush(stdout);  return 0;}clswin(x)int x;/*// 从指定的光标位置X 一致清理到屏幕的底部.*/{  MV(x,1);  printf("\033[0J\n");  fflush(stdout);  return(0);}/*// 连续清理屏幕上的X行到Y行, 程序中主要使用了行清理函数.*/Clear_line(X,Y)int X, Y;{  int ln;  for(ln=X; ln<=Y; Cline(ln), ln++);  fflush(stdout);  return 0;}/*// 光标定位函数, 可以迅速确定光标在屏幕上的位置*/mv(x, y)int x, y;{  printf("\033[%d;%dH",x,y);  fflush(stdout);  return 0;}/*// 使用写屏技术在屏幕上迅速定位.*/MV(x, y)int x, y;{  char buf[32];  sprintf(buf,"\033[%d;%dH",x,y);  write(1,buf,strlen(buf));  fflush(stdout);  return 0;}/*// 在屏幕上格式化显示一组数据.*/mvs(x,y,format,s1,s2,s3,s4,s5,s6,s7,s8,s9,s10)int x,y;char *format;char *s1,*s2,*s3,*s4,*s5,*s6,*s7,*s8,*s9,*s10;{  char Strings[256];  MV(x,y);  sprintf(Strings,format,s1,s2,s3,s4,s5,s6,s7,s8,s9,s10);  write(1,Strings,strlen(Strings));  fflush(stdout);  return(0);}cline(x) int x;/* 对屏幕上的第X行进行清理函数 */{    MV(x,1);printf("\033[2K");    fflush(stdout);    return(0);}Cline(X)int X;{  MV(X,1); printf("%79s", "");  fflush(stdout);}StrNCpy(Str1,Str2,Num)char *Str1,*Str2;int Num;/* 将Str2的前Num位拷贝到Str1中 */{  int chnum;  chnum=0;  while(*Str2 && chnum < Num) {*Str1++ = *Str2++; chnum++;}  while(Num-- > chnum) *Str1++ = ' ';  *Str1=0;  return(chnum);}/* 获得中创软件的软件序列号,可以得到软件的13位加密字 */Get_CVICserial(Fname, ser)char *ser, *Fname;{  FILE *fp;  char buf[100], Pdir[80];  int fg=0;    *ser='\0';  sprintf(Pdir,"/usr/%s", Fname);  fp=fopen(Pdir, "r");  if(fp==NULL) return(fg);  while(fgets(buf, 80, fp)){    if(!strncmp(buf,"SERIAL", 6)){      strcpy(ser, buf+7);      fg=1;    }  }  fclose(fp);  return(fg);}/* 根据软件序列号制作加密控制字 */CHpassWD(in, code)char  *in, *code;{  int  k, l;  char Str[6][32];  StrNCpy(Str[0], in, 13);  StrNCpy(Str[1], "ljmsoft.comCN",13);  k=0;  while(k<13){    code[k] = Str[0][k] & Str[1][k];    k++;  }  code[k]='\0';  return(0);}CHuserPasswd(ScodeF, codeF, fg )int fg;char *ScodeF, *codeF;{   switch(fg){     case 1:       /* 检查一个用户的加密控制字 */      {       char serial[16], calcode[16], incode[16];       Get_CVICserial(ScodeF, serial);       CHpassWD(serial, calcode);       printf("\n%10s请输入用户加密码:");       scanf("%s", incode);       return(strncmp(calcode, incode, 13));      }      break;     case 2:    /* 对一个老用户进行合法性判断 */      {       char serial[16], syscode[16], calcode[16];       FILE *fp;       fp=fopen(codeF, "r");       if(fp==NULL){         return(-1);       }       else {         fgets(syscode,15, fp);         fclose(fp);         Get_CVICserial(ScodeF, serial);         CHpassWD(serial, calcode);         return( strncmp(syscode, calcode, 13));       }     }     break;     case 3:      /* 对新用户进行加密处理 */      {       char serial[16], calcode[16], incode[16];       Get_CVICserial(ScodeF, serial);       CHpassWD(serial, calcode);       printf("\n%10s请输入用户加密码:");       scanf("%s", incode);       if(!strncmp(calcode, incode, 13)){         FILE *fp;         fp=fopen(codeF, "w");         fprintf(fp, calcode);         fclose(fp);       }    }    break;  }}       /*//////////////////////////////////////////////////////////////////////// 一组对浮点数据进行打印处理的函数, 可以对接收的数据进行格式化处理.// 根据中国帐务处理要求, 浮点数一般需要每3位加一个分节号, 小数位保留// 2位, 本组函数就是为了实现这些功能的.//////////////////////////////////////////////////////////////////////*//* **************************************************************************   浮点数处理函数,本程序可以对一个浮点数进行加工,以字符串的形式输出,可以按   照要求对一个浮点数加分节符,对于一个非常小的数据可以输出一个空白。* **************************************************************************//* **************************************************************************  prmny可以对一个浮点数按照三位分节处理,对于一个小于0.01的数据,输出一空白。  1234567.00--》1,234,567.00   程序可以对货币型数据(informix)进行处理。* **************************************************************************/prmny( Val, str)double Val;char *str;{  int i, len, l;  char Str[50], buf[50];  str[0]=0;  if(ABS(Val)<0.001) { strcpy(str, " "); return(0); }  if(Val<0 ) sprintf(str,"━");  sprintf(buf,"%.2f", ABS(Val)/100 );  /*  // 对输入的负数进行特别的处理, 显示的负号特别显眼.  */  len=strlen(buf); i=l=0;    if(len <7){       strcat(str, buf);      return(len);      }    while(len){      Str[l++]  = buf[i++];      if((len-6)%3==1 && len >=6 ) Str[l++] =',';      len --;    }    Str[l++] = 0;    if(Str[0]==',') Str[0]=' ';    strcat(str, Str);    return(strlen(str));}/* **************************************************************************  本程序是对prmny功能的加强,可以处理任意的浮点数据,加入的分节符也可以任意指  定,程序对于一个非常小的数据输出为空白。 * **************************************************************************/Prndub(val, str, n)double val;char *str;int n;{  int i,j,len;  char buf[100];  if(ABS(val)<0.00001) { strcpy( str, " "); return(0); }  sprintf(buf,"%lf",val);  i=j=len=0;  i=strlen(buf);  for(;buf[j]!='.';j++);  if(val >=0 ){    if(j <=n ){strcpy(str,buf); return(strlen(str));}    while(i){      *str++ = buf[len];      if( (j-n)%n==1 && j >=n && isdigit(buf[len-1]) ) *str++ = ',';      i--; len++; j--;      }      *str++ = 0;      return(strlen(str));      }  else {    if(j <=n+1 ){strcpy(str,buf); return(strlen(str));}    while(i){      *str++ =buf[len];      if((j-n)%n ==1 && j >=n && isdigit(buf[len-1]) )*str++ =',';      i--;j--; len++;    }    *str++ = 0;  return(strlen(str));  }}/*  绿卡数据中户名转化程序,本程序可以将一个储蓄前台数据库中的一些  不符合绿卡规范的户名转化为规范的户名。如‘会 &&774$3#计’=‘会计’。*/CHanges_Name(in, out)char  *in, *out;{    int kec;    while(*in){      kec = *in & 0x0000ffff;      if( kec > 0xffa0) *out ++ = *in;      in ++;    }    *out = '\0';}/* 将一个内部格式的时间设置为一个yyyymmdd格式的日期 */Trans_RIQI(dy, str)long    dy;char  *str;{  static char datefmt[]="yyyymmdd";  rfmtdate(dy, datefmt, str);  return(0);  /***************************************  short  int  ymd[3];  rjulmdy(dy, ymd);  sprintf(str,"%04d%02d%02d", ymd[2], ymd[0], ymd[1]);  return(0);  本函数也可以使用日期的数组分解方式来实现。日期数组分解的格式为  月、日、年,如果需要按照年月日格式输出,需要进行调整。  ***************************************/}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -