mystring.c
来自「自己做的常用库和实现的数据结构。public domain.」· C语言 代码 · 共 279 行
C
279 行
#include "my.h"void *mymemcpy(void *dst, const void *src, size_t n){ char *p = dst; const char *q = src, *r = q + n; for(; q < r; *p++ = *q++); return dst;} char *mystrcpy(char *dst, const char *src){ char *p = dst; while( (*p++ = *src++) != '\0'); return dst;}char *mystrncpy(char *dst, const char *src, size_t n){ char *p = dst; const char *q = src + n; while(src < q && (*p++ = *src++) != '\0'); return dst;}char *mystrcat(char *dst, const char *src){ char *p = dst; while(*p++); mystrcpy(--p,src); return dst;}char *mystrncat(char *dst, const char *src, size_t n){ char *p = dst; while(*p++); mystrncpy(--p, src, n); return dst;}int mystrcmp(const char *s1, const char *s2){ for(; *s1 && *s2 && *s1 == *s2; s1++,s2++); return(*s1 - *s2);}int mystrncmp(const char *s1, const char *s2, size_t n){ const char *s3 = s1 + n; for(; s1 < s3 && *s1 && *s2 && *s1 == *s2; s1++,s2++); return(*s1 - *s2);}int mymemcmp(const void *s1, const void *s2, size_t n){ const char *p = s1, *q = s2, *r = p + n; for(; p < r && *p == *q; p++,q++); return(*p - *q);}void *mymemchr(const void *src, int c, size_t n){ const unsigned char *p = src, *q = p + n; for(; p < q && *p && *p != (unsigned char)c; p++); return *p && p != q ? (void *)p : NULL;}char *mystrchr(const char *src, int c){ for(; *src && *src != (char)c; src++); return *src ? (char *)src : NULL;}char *mystrrchr(const char *src, int c){ const char *p = src; while(*p++); while(--p >= src) if(*p == (char)c) return (char *)p; return NULL;}size_t mystrcspn(const char *src, const char *sub){ const char *p = src, *q; for(; *p; p++) for(q=sub; *q; q++) if(*p == *q) return p-src; return p-src;}char *mystrpbrk(const char *src, const char *sub){ const char *q; for(; *src; src++) for(q=sub; *q; q++) if(*src == *q) return (char *)src; return NULL;}size_t mystrlen(const char *src){ const char *p = src; while(*p++); return(--p - src);}char *mystrstr(const char *src, const char *sub){ const char *p,*q; int flag; for(; *src; src++) { for(p=src,flag=1,q=sub; *q; q++,src++) if(*src != *q) { flag=0; break; } if(flag) return (char *)p; } return NULL;}void *mymemset(void *src, int c, size_t n){ unsigned char *p = src, *q = p + n; for(; p < q; *p++ = (unsigned char)c); return src;}/* Yet another strcpy(), [begin, end] points to sequential location in ONE source. */char *yastrcpy(char *dst, const char *begin, const char * const end){ char *p = dst; for(; begin <= end; *p++ = *begin++); return dst;}/* Place source string in revsered order. */char *strrev(char *src){ char t, *p = src, *q = src; for(; *q; q++); while( p < --q) { t = *p; *p++ = *q; *q = t; } return src;}/* Locate the last occurence of matching substring in given source string. */char *strrstr(const char *src, const char *sub){ const char *p=src, *q=sub, *t; int flag; while(*p++); while(*q++); while(--p >= src) { for(t=--q,flag=1; t >= sub; t--,p--) if(*p != *t) { flag=0; break; } if(flag) return (char *)++p; } return NULL;}/* Count how many ASCII words in given string, * including compound word with joint dash symbol(s). */size_t scntwd(const char *src){ int t; size_t cnt = 0; while((t = *src++) != '\0') if(isalpha(t)) {loop: if(*src == '\0') return ++cnt; if(isalpha(t = *src++) || t == '-') goto loop; else cnt++; } return cnt;}/* Count how many ASCII words in given open stream, * including compound word with joint dash symbol(s). */size_t fcntwd(FILE *fp){ int t; size_t cnt = 0; while(!feof(fp)) if(isalpha(t=fgetc(fp))) {loop: if(feof(fp)) return ++cnt; if(isalpha(t=fgetc(fp)) || t == '-') goto loop; else cnt++; } return cnt;}/* Check for identical chars in given string, * return true if yes, false if no or string empty. */bool isdupchr(const unsigned char *src){ int buf[256] = {0}; while(*src) { if(buf[*src] == 1) return true; buf[*src++] = 1; } return false;}static void strmv(char *src, ssize_t n){ char *p = src; if(n<0) { for(; *p; *(p+n) = *p++); *(p+n) = '\0'; } else if(n>0) { while(*p++); for(; --p >= src; *(p+n) = *p); }}/* Substitute all matching substr(s) with replstr in given source string, * which is supposed to be big enough to hold all changes; * if replace string is empty, it means delete all matching substring(s). */char *strsstr(char *src, const char *sub, const char *repl){ char *p = src, *t; size_t lens = strlen(sub), lenr = strlen(repl); for(; *p; p++) if((t=strstr(--p,sub)) != NULL) { if(lens >= lenr) { strncpy(t, repl, lenr); strmv(t+lens, lenr-lens); } else { strncpy(t, repl, lens); strmv(t+lens, lenr-lens); strncpy(t+lens, repl+lenr-lens, lenr-lens); } p = t+lenr-1; } return src;}static long writechar(FILE *fp, long offset, int flag, int c){ long t = fseek(fp, offset, SEEK_CUR); if(flag) fputc(c, fp); return t;}/* Format source stream into n byte wide, stream must be "rb+" or "r+b"; * fp will be rewinded when done; returns 0 on success, -1 on failure. */int ffmt(FILE *fp, size_t n){ int c,t,flag; size_t i; for(;;) { for(flag=i=1; i<n; i++) { if( (c=fgetc(fp)) == EOF) { rewind(fp); return 0; } if(isspace(c)) { writechar(fp, -1L, 1, (int)' '); flag=0; } }loop: if(flag || writechar(fp, -2L, 0, 0) == -1) { rewind(fp); return -1; } t=fgetc(fp), c=fgetc(fp); if(c == ' ') writechar(fp, -1L, 1, (int)'\n'); else if(t == ' ' && c != ' ') writechar(fp, -2L, 1, (int)'\n'); else { writechar(fp, -2L, 0, 0); goto loop; } }}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?