字符串操作函數原型實現

//將兩個char類型連接:
char * __cdecl strcat(char * dst, const char * src)
{
         char * cp = dst;

         while( *cp )
                 cp++; 
         while( *cp++ = *src++ ) ;

         return( dst );
}

 
//C語言標準庫函數strcpy,把從src地址開始且含有'\0'結束符的字符串複製到以dest開始的地址空間: 
char * __cdecl strcpy(char * dst, const char * src)
{
         char * cp = dst;
         while( *cp++ = *src++ );          
	 return( dst );
}


//查找字符串s中首次出現字符c的位置 
char * __cdecl strchr(const char * string, int ch)
{
         while (*string && *string != (char)ch)
                 string++;
         if (*string == (char)ch)
                 return((char *)string);
         return(NULL);
}

/*C/C++函數,比較兩個字符串,設這兩個字符串爲str1,str2,若str1=str2,則返回零;若str1<str2,則返回負數;若str1>str2,則返回正數. */
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 strnlen(const char *str, size_t maxsize)
{
     size_t n;
     for (n = 0; n < maxsize && *str; n++, str++) ;
     
     return n;
}

//求字符串長度
size_t __cdecl strlen(const char * str)
{
         const char *eos = str;
         while( *eos++ ) ;
         return( eos - str - 1 );
}

//拷貝安全函數 
errno_t __cdecl strcpy_s(_CHAR *_DEST, size_t _SIZE, const _CHAR *_SRC)
{
     _CHAR *p;
     size_t available;

     _VALIDATE_STRING(_DEST, _SIZE);
     _VALIDATE_POINTER_RESET_STRING(_SRC, _DEST, _SIZE);

     p = _DEST;
     available = _SIZE;
     while ((*p++ = *_SRC++) != 0 && --available > 0){}

     if (available == 0)
     {
         _RESET_STRING(_DEST, _SIZE);
         _RETURN_BUFFER_TOO_SMALL(_DEST, _SIZE);
     }
     _FILL_STRING(_DEST, _SIZE, _SIZE - available + 1);
     _RETURN_NO_ERROR;
}

char * __cdecl strncpy(char * dest, const char * source, size_t count)
{
         char *start = dest;
         while (count && (*dest++ = *source++))    // copy str 
                 count--;
         if (count)  
	     while (--count)  
                 *dest++ = '\0';

         return(start);
 }


/*strstr(str1,str2)函數用於判斷字符串str2是否是str1的子串.如果是,則該函數返回str2在str1中首次出現的地址;否則,返回NULL. */
char * __cdecl strstr(const char * str1, const char * str2)
{
         char *cp = (char *) str1;
         char *s1, *s2;
         if ( !*str2 )
             return((char *)str1);

         while (*cp)
         {
                 s1 = cp;
                 s2 = (char *) str2;

                 while (*s1 && *s2 && !(*s1-*s2)) s1++, s2++;

                 if (!*s2)
                         return(cp);

                 cp++;
         }
         return(NULL);
}

//strstr(str1,str2)函數用於判斷字符串str2是否是str1的子串.如果是,則該函數返回str2在str1中最後一次次出現的地址(也就是從右往左第一次出現的位置);否則,返回NULL.
char * __cdecl strrchr(const char * string, int ch)
{
         char *start = (char *)string;
         while (*string++) ; /* find end of string */       
         while (--string != start && *string != (char)ch) ;
         if (*string == (char)ch)  return( (char *)string );

         return(NULL);
}


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章