📄 strlib.c
字号:
/*----------------------------------------------------------------------------* * 功 能: 字符串操作库. * * 版 本: 1.00 * * 运行环境: SCO UNIX V3.2.4 以上版本. * * 历史记录: 日 期 作 者 备 注 * *----------------------------------------------------------------------------* * 1999/10/20 赖正兴 创建 * *----------------------------------------------------------------------------* * All rights reserved. Copyright (C) 1999-20001. * *----------------------------------------------------------------------------*/#include "strlib.h"/****************************************************************************** * <第一章> 字符串操作函数. * ******************************************************************************//*----------------------------------------------------------------------------* * Function: SPACE(生成空格). * Argument: * int num - 空格数目. * Return : * char * - 指针. * NULL - 长度小于0或太大. *----------------------------------------------------------------------------*/char *space(int num){ static char space_buf[DATA_LENGTH+1]; static int first_sign=TRUE; if(first_sign) { memset(space_buf,' ',512); *(space_buf+512)='\0'; first_sign=FALSE; } if(num<=0||num>DATA_LENGTH) return(""); return(space_buf+DATA_LENGTH-num);}/*----------------------------------------------------------------------------* * FUNCTION: 删除字符串右边空格和TAB键(str的值要变). * Argument: * char *str - 字符串. * Return : * 指针. *----------------------------------------------------------------------------*/char *rtrim(char *str){ int i; if( (i=strlen(str)) == 0 ) return(str); i-=1; while(i>=0 && (str[i]==' '||str[i]=='\t')) { i--; } i++; *(str+i)='\0'; return(str);}/*----------------------------------------------------------------------------* * FUNCTION: 删除字符串左边空格和TAB键(str的值要变). * Argument: * char *str - 字符串. * Return : * 指针. *----------------------------------------------------------------------------*/char *ltrim(char *str){ int i,len; char tmp[DATA_LENGTH]; if( (len=strlen(str)) == 0 ) return(str); for(i=0; i<len; i++) { if(str[i] != ' ' && str[i] != '\t') break; } strcpy(tmp,&str[i]); strcpy(str,tmp); return(str);}/*----------------------------------------------------------------------------* * FUNCTION: 删除字符串两边空格和TAB键(str的值要变). * Argument: * char *str - 字符串. * Return : * 指针. *----------------------------------------------------------------------------*/char *trim(char *str){ rtrim(str); ltrim(str); return(str);}/*----------------------------------------------------------------------------* * Function: 由分隔符分开的子串总数目. * Argument: * char *str - 串. * char ch - 分隔字符. * Return : * > 0 总数目(1...n). * = 0 没有匹配项. *----------------------------------------------------------------------------*/int get_item_num(char *str,char ch){ int i,len,num=0; len=strlen(str); for(i=0; i< len; i++) if(str[i] == ch) num++; if(num > 0) num++; return(num);}/*----------------------------------------------------------------------------* * Function: 读取分隔符分开的第几个子串. * Argument: * char *str - 源串. * char ch - 分隔字符. * int num - 第几个(0..n). * Return : * 结果子串. * NULL - 超过子串数目或没有匹配项. *----------------------------------------------------------------------------*/char *get_item(char *str,char ch,int num){ int i,total_num; char *p,substr[DATA_LENGTH]; if( (total_num=get_item_num(str,ch)) == 0 ) { return(NULL); } if(num >= total_num) { return(NULL); } i=0; p=(char *)str; while(i++ < num) { while(*p++ != ch); } i=0; while(*p !=ch && *p !='\0') { substr[i++] = *p++; } substr[i]='\0'; return(substr);}/*----------------------------------------------------------------------------* * Function: 检查字串中,整数部分的有效位数. * Argument: * char *numbuf - 字串. * Return : * >= 0 整数部分的位数. * < 0 Error. *----------------------------------------------------------------------------*/int check_intlen(char *numbuf){ char *tmpbuf; int i,len; len=strlen(numbuf); if( (tmpbuf=(char *)malloc(len+5)) == NULL ) return -1; strcpy(tmpbuf,numbuf); i=is_in(tmpbuf,'.'); if(i > -1) { tmpbuf[i] = '\0'; } rtrim(tmpbuf); ltrim(tmpbuf); if(is_in("0123456789-",tmpbuf[0]) == -1) { tmpbuf[0]='\0'; } if(tmpbuf[0] == '-') { tmpbuf[0]=' '; rtrim(tmpbuf); } i=0; while( tmpbuf[i] !='\0' && tmpbuf[i] <='9' && tmpbuf[i] >='0') i++; tmpbuf[i]='\0'; len=strlen(tmpbuf); free(tmpbuf); return(len);}/*----------------------------------------------------------------------------* * Function: 由分隔符分开的子串最大长度. * Argument: * char *str - 串. * char ch - 分隔字符. * Return : * >= 0 最大长度. * < 0 不存在. *----------------------------------------------------------------------------*/int get_item_maxlen(char *str,char ch){ char *p,*q,*strchr(); int i,j,len,maxlen; if(strchr(str,ch) == NULL) /* not found ch */ return(-1); len=strlen(str); j=maxlen=0; for(i=0; i<len; i++) { if(str[i] == ch) { if(j > maxlen) { maxlen=j; } j=0; } else { j++; } } if(j > maxlen) maxlen=j; return(maxlen);}/*----------------------------------------------------------------------------* * Function: 检查字符是否在字符串中出现,并且返回序号(0...N). * Argument: * char *str - 字符串. * char c - 字符. * Return : * >= 0 if in. * = -1 if not in. *----------------------------------------------------------------------------*/int is_in(char *str,char ch){ char *ptr,*strchr(); if((ptr=strchr(str,ch)) == NULL) return(-1); return(ptr-str);}/*----------------------------------------------------------------------------* * FUNCTION: 求字符在字符串中出现的次数(1...N). * Argument: * char *str - 字符串. * char c - 字符. * Return : * > 0 if in. * = 0 if not in. *----------------------------------------------------------------------------*/int count_chnum(char *str,char ch){ int count=0,i,len; len=strlen(str); for(i=0; i < len; i++) if(str[i] == ch) count++; return(count);}/*----------------------------------------------------------------------------* * Function: 检查字符串 substr 是否为字符串 str 的子串,并且返回序号. * Argument: * char *substr - 子串. * char *str - 字符串. * Return : * 0...n index on str,if found. * -1 if not found. *----------------------------------------------------------------------------*/index_on_str(char *substr,char *str){ int len; char *s,*t,*strchr(); /****char *strchr(char *str,char ch) 函数用法: 函数返回字符ch在串str中第一次出现的指针. 如果没发现匹配,则函数返回空指针NULL.****/ s=(char *)substr; t=(char *)str; len = strlen(substr); while ((t = strchr(t, *s)) != NULL) { if (strncmp(s, t, len) == 0) return(t-str); /* found */ t++; } return(-1);}/*----------------------------------------------------------------------------* * Function: <字串>在<字串表>中序号(0...N). * Argument: * char *str - 字符串. * char **strtab - 字符串表. * Return : * 0...n index on strtab,if found. * -1 if not found. * Notes : 字串表 以 '\0' 串结束. *----------------------------------------------------------------------------*/index_on_strtab(char *str,char **strtab){ char **mp; for (mp = strtab; *mp; ++mp) { if (index_on_str(*mp, str) != -1) { return(mp-strtab); /* index on strtab(0...n) */ } } return(-1);}/*----------------------------------------------------------------------------* * Function: Ring Bell. * Argument: * int num - Bell numbers. * Return : None. *----------------------------------------------------------------------------*/void beeps(int num){ while(num--) {#if 0 beep();#else putchar('\7');#endif }}/*----------------------------------------------------------------------------* * FUNCTION: 连接若干子串(最后一个串之后,以NULL结束) * Argument: * char *strbuf - 第一个字符串,连接后的串返回到该串中. * 多个字串,以NULL结束. * Return : * None. *----------------------------------------------------------------------------*/strcatm(strbuf,va_alist)char *strbuf;va_dcl{ va_list arg_ptr; char *str_ptr; va_start(arg_ptr); while((str_ptr=va_arg(arg_ptr,char *))!=NULL) strcat(strbuf,str_ptr); va_end(arg_ptr);}/*----------------------------------------------------------------------------* * FUNCTION: 截取子字符串(string不变). * Argument: * char *string - 字符串. * int start - 开始位置. * int number - 截取长度. * Return : * char * - 子字符串指针. *----------------------------------------------------------------------------*/char *substr(char *string,int start,int number){ static char buffer[DATA_LENGTH]; int length; length=strlen(string); if(start<0||number<0||number>511||start+number>length) return(""); memcpy(buffer,string+start,number); *(buffer+number)='\0'; return(buffer);}/*----------------------------------------------------------------------------* * FUNCTION: 反转字串(string要改变), 如:"1234" -> "4321". * Argument: * char *string - 字符串. * Return : * char * - 字符串指针. *----------------------------------------------------------------------------*/char *strrev(char *string){ long int i,len; unsigned char c; len=strlen(string)-1; for(i=0;i<=len;i++) { if(i>=len-i) break; c=*(string+i); *(string+i)=*(string+len-i); *(string+len-i)=c; } return(string);}/*----------------------------------------------------------------------------* * FUNCTION: 把string2插入string1中. * Argument: * char *string1 - 字符串1. * int start - 开始位置. * int number - 长度. * char *string2 - 字符串2. * Return : * char * - 字符串指针. *----------------------------------------------------------------------------*/char *ins_str(char *string1,int start,int number,char *string2){ int len,cunt; len=strlen(string2); if(number>len) number=len; len=strlen(string1); for(cunt=len;cunt>=start;cunt--) *(string1+cunt+number)=*(string1+cunt); for(cunt=0;cunt<number;cunt++) *(string1+start+cunt)=*(string2+cunt); return(string1);}/*----------------------------------------------------------------------------* * FUNCTION: 把string中的字符c1替换为c2. * Argument: * char *string - 字符串. * char *c1 - 字符1. * char *c2 - 字符2. * Return : * char * - 字符串指针. *----------------------------------------------------------------------------*/char *strcce(char *string,char c1,char c2){ int i,len; len=strlen(string); for(i=0;i<len;i++) { if(string[i] == c1) string[i]=c2; } return(string);}/*----------------------------------------------------------------------------* * FUNCTION: 字符删除. * Argument: * char *string - 字符串. * char *c - 删除的字符. * Return : * char * - 字符串指针. *----------------------------------------------------------------------------*/char *strcd(char *string,char c){ int i,j,len; char *strbuf; len=strlen(string); strbuf=(char *)malloc(len+1); for(i=0,j=0; i<len;i++) { if(string[i] != c) strbuf[j++]=string[i]; } strbuf[j]='\0'; strcpy(string,strbuf); free(strbuf); return(string);}/*----------------------------------------------------------------------------* * FUNCTION: 把字串(可以转换的字符)转成大写. * Argument: * char *string - 字符串. * Return : * char * - 字符串指针. *----------------------------------------------------------------------------*/char *str_toupper(char *string){ char *ptr; int cunt,len; len=strlen(string); ptr=string; for(cunt=0;cunt<len;cunt++) { *ptr++=my_toupper(*ptr); } return(string);}/*----------------------------------------------------------------------------* * FUNCTION: 把字串(可以转换的字符)转成小写 * Argument: * char *string - 字符串.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -