- //得2分
- void strcpy( char *strDest, char *strSrc )
- {
- while( (*strDest++ = * strSrc++) != '/0' );
- }
- //得4分
- void strcpy( char *strDest, const char *strSrc )
- {
- //將源字符串加const,表明其爲輸入參數,加2分
- while( (*strDest++ = * strSrc++) != '/0' );
- }
- //得7分
- void strcpy(char *strDest, const char *strSrc)
- {
- //對源地址和目的地址加非0斷言,加3分
- assert( (strDest != NULL) && (strSrc != NULL) );
- while( (*strDest++ = * strSrc++) != '/0' );
- }
- //得9分
- //爲了實現鏈式操作,將目的地址返回,加2分!
- char * strcpy( char *strDest, const char *strSrc )
- {
- assert( (strDest != NULL) && (strSrc != NULL) );
- char *address = strDest;
- while( (*strDest++ = * strSrc++) != '/0' );
- return address;
- }
- //得10分,基本上所有的情況,都考慮到了
- //如果有考慮到源目所指區域有重疊的情況,加1分!
- char * strcpy( char *strDest, const char *strSrc )
- {
- if(strDest == strSrc) { return strDest; }
- assert( (strDest != NULL) && (strSrc != NULL) );
- char *address = strDest;
- while( (*strDest++ = * strSrc++) != '/0' );
- return address;
- }
- //@yansha:字串末尾要加結束符'/0',不然輸出錯位結果
- char *strncpy(char *strDes, const char *strSrc, unsigned int count)
- {
- assert(strDes != NULL && strSrc != NULL);
- char *address = strDes;
- while (count-- && *strSrc != '/0')
- *strDes++ = *strSrc++;
- *strDes = '/0';
- return address;
- }
- //查找字符串s中首次出現字符c的位置
- char *strchr(const char *str, int c)
- {
- assert(str != NULL);
- for (; *str != (char)c; ++ str)
- if (*str == '/0')
- return NULL;
- return str;
- }
- int strcmp(const char *s, const char *t)
- {
- assert(s != NULL && t != NULL);
- while (*s && *t && *s == *t)
- {
- ++ s;
- ++ t;
- }
- return (*s - *t);
- }
- char *strcat(char *strDes, const char *strSrc)
- {
- assert((strDes != NULL) && (strSrc != NULL));
- char *address = strDes;
- while (*strDes != '/0')
- ++ strDes;
- while ((*strDes ++ = *strSrc ++) != '/0')
- NULL;
- return address;
- }
- int strlen(const char *str)
- {
- assert(str != NULL);
- int len = 0;
- while (*str ++ != '/0')
- ++ len;
- return len;
- }
- //此函數,夢修改如下
- char *strdup_(char *strSrc)
- //將字符串拷貝到新的位置
- {
- if(strSrc!=NULL)
- {
- char *start=strSrc;
- int len=0;
- while(*strSrc++!='/0')
- len++;
- char *address=(char *)malloc(len+1);
- assert(address != NULL);
- while((*address++=*start++)!='/0');
- return address-(len+1);
- }
- return NULL;
- }
- //多謝laoyi19861011指正
- char *strstr(const char *strSrc, const char *str)
- {
- assert(strSrc != NULL && str != NULL);
- const char *s = strSrc;
- const char *t = str;
- for (; *strSrc != '/0'; ++ strSrc)
- {
- for (s = strSrc, t = str; *t != '/0' && *s == *t; ++s, ++t)
- NULL;
- if (*t == '/0')
- return (char *) strSrc;
- }
- return NULL;
- }
- char *strncat(char *strDes, const char *strSrc, unsigned int count)
- {
- assert((strDes != NULL) && (strSrc != NULL));
- char *address = strDes;
- while (*strDes != '/0')
- ++ strDes;
- while (count -- && *strSrc != '/0' )
- *strDes ++ = *strSrc ++;
- *strDes = '/0';
- return address;
- }
- int strncmp(const char *s, const char *t, unsigned int count)
- {
- assert((s != NULL) && (t != NULL));
- while (*s && *t && *s == *t && count --)
- {
- ++ s;
- ++ t;
- }
- return (*s - *t);
- }
- char *strpbrk(const char *strSrc, const char *str)
- {
- assert((strSrc != NULL) && (str != NULL));
- const char *s;
- while (*strSrc != '/0')
- {
- s = str;
- while (*s != '/0')
- {
- if (*strSrc == *s)
- return (char *) strSrc;
- ++ s;
- }
- ++ strSrc;
- }
- return NULL;
- }
- int strcspn(const char *strSrc, const char *str)
- {
- assert((strSrc != NULL) && (str != NULL));
- const char *s;
- const char *t = strSrc;
- while (*t != '/0')
- {
- s = str;
- while (*s != '/0')
- {
- if (*t == *s)
- return t - strSrc;
- ++ s;
- }
- ++ t;
- }
- return 0;
- }
- int strspn(const char *strSrc, const char *str)
- {
- assert((strSrc != NULL) && (str != NULL));
- const char *s;
- const char *t = strSrc;
- while (*t != '/0')
- {
- s = str;
- while (*s != '/0')
- {
- if (*t == *s)
- break;
- ++ s;
- }
- if (*s == '/0')
- return t - strSrc;
- ++ t;
- }
- return 0;
- }
- char *strrchr(const char *str, int c)
- {
- assert(str != NULL);
- const char *s = str;
- while (*s != '/0')
- ++ s;
- for (-- s; *s != (char) c; -- s)
- if (s == str)
- return NULL;
- return (char *) s;
- }
- char* strrev(char *str)
- {
- assert(str != NULL);
- char *s = str, *t = str, c;
- while (*t != '/0')
- ++ t;
- for (-- t; s < t; ++ s, -- t)
- {
- c = *s;
- *s = *t;
- *t = c;
- }
- return str;
- }
- char *strnset(char *str, int c, unsigned int count)
- {
- assert(str != NULL);
- char *s = str;
- for (; *s != '/0' && s - str < count; ++ s)
- *s = (char) c;
- return str;
- }
- char *strset(char *str, int c)
- {
- assert(str != NULL);
- char *s = str;
- for (; *s != '/0'; ++ s)
- *s = (char) c;
- return str;
- }
- //@heyaming
- //對原 strtok 的修改,根據MSDN,strToken可以爲NULL.實際上第一次call strtok給定一字串,
- //再call strtok時可以輸入NULL代表要接着處理給定字串。
- //所以需要用一 static 保存沒有處理完的字串。同時也需要處理多個分隔符在一起的情況。
- char *strtok(char *strToken, const char *str)
- {
- assert(str != NULL);
- static char *last;
- if (strToken == NULL && (strToken = last) == NULL)
- return (NULL);
- char *s = strToken;
- const char *t = str;
- while (*s != '/0')
- {
- t = str;
- while (*t != '/0')
- {
- if (*s == *t)
- {
- last = s + 1;
- if (s - strToken == 0) {
- strToken = last;
- break;
- }
- *(strToken + (s - strToken)) = '/0';
- return strToken;
- }
- ++ t;
- }
- ++ s;
- }
- return NULL;
- }
- char *strupr(char *str)
- {
- assert(str != NULL);
- char *s = str;
- while (*s != '/0')
- {
- if (*s >= 'a' && *s <= 'z')
- *s -= 0x20;
- s ++;
- }
- return str;
- }
- char *strlwr(char *str)
- {
- assert(str != NULL);
- char *s = str;
- while (*s != '/0')
- {
- if (*s >= 'A' && *s <= 'Z')
- *s += 0x20;
- s ++;
- }
- return str;
- }
- void *memcpy(void *dest, const void *src, unsigned int count)
- {
- assert((dest != NULL) && (src != NULL));
- void *address = dest;
- while (count --)
- {
- *(char *) dest = *(char *) src;
- dest = (char *) dest + 1;
- src = (char *) src + 1;
- }
- return address;
- }
- void *memccpy(void *dest, const void *src, int c, unsigned int count)
- {
- assert((dest != NULL) && (src != NULL));
- while (count --)
- {
- *(char *) dest = *(char *) src;
- if (* (char *) src == (char) c)
- return ((char *)dest + 1);
- dest = (char *) dest + 1;
- src = (char *) src + 1;
- }
- return NULL;
- }
- void *memchr(const void *buf, int c, unsigned int count)
- {
- assert(buf != NULL);
- while (count --)
- {
- if (*(char *) buf == c)
- return (void *) buf;
- buf = (char *) buf + 1;
- }
- return NULL;
- }
- int memcmp(const void *s, const void *t, unsigned int count)
- {
- assert((s != NULL) && (t != NULL));
- while (*(char *) s && *(char *) t && *(char *) s == *(char *) t && count --)
- {
- s = (char *) s + 1;
- t = (char *) t + 1;
- }
- return (*(char *) s - *(char *) t);
- }
- //@big:
- //要處理src和dest有重疊的情況,不是從尾巴開始移動就沒問題了。
- //一種情況是dest小於src有重疊,這個時候要從頭開始移動,
- //另一種是dest大於src有重疊,這個時候要從尾開始移動。
- void *memmove(void *dest, const void *src, unsigned int count)
- {
- assert(dest != NULL && src != NULL);
- char* pdest = (char*) dest;
- char* psrc = (char*) src;
- //pdest在psrc後面,且兩者距離小於count時,從尾部開始移動. 其他情況從頭部開始移動
- if (pdest > psrc && pdest - psrc < count)
- {
- while (count--)
- {
- *(pdest + count) = *(psrc + count);
- }
- } else
- {
- while (count--)
- {
- *pdest++ = *psrc++;
- }
- }
- return dest;
- }
- void *memset(void *str, int c, unsigned int count)
- {
- assert(str != NULL);
- void *s = str;
- while (count --)
- {
- *(char *) s = (char) c;
- s = (char *) s + 1;
- }
- return str;
- }
標準C庫函數
- char * __cdecl strcat (char * dst,const char * src)
- {
- char * cp = dst;
- while( *cp )
- cp++; /* find end of dst */
- while( *cp++ = *src++ ) ; /* Copy src to end of dst */
- return( dst ); /* return dst */
- }
- int __cdecl strcmp (const char * src,const char * dst)
- {
- int ret = 0 ;
- while( ! (ret = *(unsigned char *)src - *(unsigned char *)dst) && *dst)
- ++src, ++dst;
- if ( ret < 0 )
- ret = -1 ;
- else if ( ret > 0 )
- ret = 1 ;
- return( ret );
- }
- size_t __cdecl strlen (const char * str)
- {
- const char *eos = str;
- while( *eos++ ) ;
- return( (int)(eos - str - 1) );
- }
- char * __cdecl strncat (char * front,const char * back,size_t count)
- {
- char *start = front;
- while (*front++)
- ;
- front--;
- while (count--)
- if (!(*front++ = *back++))
- return(start);
- *front = '/0';
- return(start);
- }
- int __cdecl strncmp (const char * first,const char * last,size_t count)
- {
- if (!count)
- return(0);
- while (--count && *first && *first == *last)
- {
- first++;
- last++;
- }
- return( *(unsigned char *)first - *(unsigned char *)last );
- }
- /* Copy SRC to DEST. */
- char *
- strcpy (dest, src)
- char *dest;
- const char *src;
- {
- reg_char c;
- char *__unbounded s = (char *__unbounded) CHECK_BOUNDS_LOW (src);
- const ptrdiff_t off = CHECK_BOUNDS_LOW (dest) - s - 1;
- size_t n;
- do
- {
- c = *s++;
- s[off] = c;
- }
- while (c != '/0');
- n = s - src;
- (void) CHECK_BOUNDS_HIGH (src + n);
- (void) CHECK_BOUNDS_HIGH (dest + n);
- return dest;
- }
- char * __cdecl strncpy (char * dest,const char * source,size_t count)
- {
- char *start = dest;
- while (count && (*dest++ = *source++)) /* copy string */
- count--;
- if (count) /* pad out with zeroes */
- while (--count)
- *dest++ = '/0';
- return(start);
- }