string.h c源碼實現

來源:互聯網
上載者:User

標籤:

int isspace( char c ){char comp[] = { ‘ ‘, ‘\t‘, ‘\r‘, ‘\n‘, ‘\v‘, ‘\f‘ };const int len = 6;for ( int i=0; i<len; ++i ){if ( c == comp[i] )return 1;}return 0;}char tolower( char c ){if ( c >= ‘A‘ && c <= ‘Z‘ )return ( c + 32 );return c;}// 在字串s中尋找 c 第一次出現的 位置。// 找到: 返回指標位置; 未找到: 返回NULLchar * strchr( const char * s, int c ){for ( ; *s != (char)c; ++s ){if ( *s == ‘\0‘ )return NULL; // 如果s已抵達尾部,為找到,返回NULL}return (char *)s; // 返回 c在s的指標位置}// 在字串S中從末尾開始尋找字元c, 找到則返回 字串指標位置,未找到返回NULLchar * strrchr( const char * s, int c ){const char * p = s + strlen( s ); // p 指向 s 的末端do {if ( *p == (char)c )return (char *)p; // } while ( --p >= s ); return NULL;}// 在字串S中指定長度內尋找字元C。char * strnchr( const char * s, size_t count, int c ){for ( ; count-- && *s != ‘\0‘; ++s ){if ( *s == (char)c )return (char *)s;}return NULL;}// 搜尋一個字串 s2 在另一個字串 s1 中的第一次出現char * strstr( const char * s1, const char * s2 ){size_t l1, l2;l2 = strlen( s2 );if ( !l2 )return (char *)s1;l1 = strlen( s1 );while ( l1 >= l2 ){l1--;if ( !memcmp( s1, s2, l2) )return (char *)s1;s1++;}return NULL;}// 從字串s開頭尋找符合 accept 字元, 返回字串s開頭連續包含字串 accept 內的字元數目。// 如返回n,則代表 字串s 開頭連續有n個字元都屬於字串accept內的字元。//char *str="Linux was first developed for 386/486-based pcs.";//printf("%d\n",strspn(str,"Linux")); // 輸出為 5//printf("%d\n",strspn(str,"/-")); // 輸出為 0//printf("%d\n",strspn(str,"1234567890")); // 輸出為 0size_t strspn( const char * s, const char * accept ){const char * p;const char * a;size_t count = 0;for ( p = s; *p != ‘\0‘; ++p ){for ( a = accept; *a != ‘\0‘; ++a ) // *p 逐個與 accept允許的字串比對。{if ( *p == *a ) // 只要符合 accept,跳出accept迴圈,count+1break;}if ( *a == ‘\0‘ ) // 如果 accept 到了末尾,則表示出現第一個不符合accept的字元位置了。return count;++count;}return count;}// 從字串s開頭尋找符合 reject 字元, 返回字串s 開頭連續不含字串 reject 內的字元數目// 如返回n, 則代表字串s 開頭連續有n 個字元都不含字串 reject 內的字元.//char *str = "Linux was first developed for 386/486-based pcs. ";//printf("%d\n", strcspn(str, " ")); // 輸出 5 ;只計算到" "的出現, 所以返回"Linux"的長度//printf("%d\n", strcspn(str, "/-")); // 輸出 33 ; 計算到出現"/"或"-", 所以返回到"6"的長度//printf("%d\n", strcspn(str, "1234567890")); // 輸出 30 ; 計算到出現數字字元為止, 所以返回"3"出現前的長度size_t strcspn( const char * s, const char * reject ){const char * p;const char * r;size_t count = 0;for ( p = s; *p != ‘\0‘; ++p ){for ( r = reject; *r != ‘\0‘; ++r ){if ( *p == *r ) // 如果 *p 等於 *r, 則返回 長度return count;}++count; // 2者不相等時,count+1}return count;}// 在字串S1中 檢驗 S2串,當s2字元出線在s1中時,則停止檢驗,並返回該字元位置// char *s = "12,3a,45"// char *ptr = strpbrk(s, ","); // ptr = ,3a,45char * strpbrk( const char * s1, const char * s2 ){const char * sc1, * sc2;for ( sc1 = s1; *sc1 != ‘\0‘; ++sc1 ){for ( sc2 = s2; *sc2 != ‘\0‘; ++sc2 ){if ( *sc1 == *sc2 ) // 如果 在 s1 中找到符合 s2 的字元return (char *)sc1; // 則直接返回該字元位置}}return NULL; // 未找到則返回 NULL}char * strsep( char **s, const char *ct ){char * sbegin = *s;char * end;if ( *sbegin == NULL )return NULL;end = strpbrk( sbegin, ct ); // 在 sbegin 中 尋找 ct 第一次出線的位置。if ( end ) // 找到了*end++ = ‘\0‘; // 添加 結束符‘\0‘*s = end; // s指向了新的 開始位置return sbegin;}// 跳過空白符char * skip_spaces( const char * str ){while ( isspace( *str) )++str;return (char *)str;}// 跳過首尾的空白符char * strim( char * s ){size_t size;char * end;s = skip_spaces( s ); // 跳過空白符size = strlen( s ); // 計算 s 字元長度if ( !size ) // 長度為0,則直接返回s return s; // s = ‘\0‘end = s + size - 1; // end 指向 s 字串末尾while ( end >= s && isspace( *end ) ) // 跳過末尾的空白符end--;*( end + 1 ) = ‘\0‘; // 設定下一位為 ‘\0‘return s;} // 計算字串s的長度. 以 ‘\0‘ 結尾size_t strlen( const char * s ){const char * sc;for ( sc = s; *sc != ‘\0‘; ++sc ); // nothingreturn sc - s;}// 比較指定長度的2個字串, 不區分大小寫int strnicmp( const char * s1, const char * s2, size_t len ){unsigned char c1, c2;if ( !len )return 0;do {c1 = *s1++;c2 = *s2++;if ( !c1 || !c2 ) // 如果其中一個為空白break;if ( c1 == c2 ) // 相等,則繼續比較下一個continue;c1 = tolower( c1 );c2 = tolower( c2 ); // 都轉換為小寫if ( c1 != c2 ) // 不相等break;} while ( --len ); // 在指定長度內比較return (int)c1 - (int)c2; // 跳出迴圈後,比較字元是否相等。}// 比較2個字串, 不區分大小寫。int strcasecmp( const char * s1, const char * s2 ){int c1, c2;do {c1 = tolower( *s1++ );c2 = tolower( *s2++ );} while ( c1 == c2 && c1 != ‘0‘ ); //return c1 - c2;}// 比較指定長度的2個字串, 不區分大小寫int strncasecmp( const char * s1, const char * s2, size_t n ){int c1, c2;do {c1 = tolower( *s1++ );c2 = tolower( *s2++ );} while ( ( --n > 0) && c1 == c2 && c1 != ‘0‘ ); //return c1 - c2;}// 字串拷貝。 將 src 內容 拷貝到 dest 中。// 這裡不帶長度,src 長度 大於 dest 長度,則會超出 儲存範圍。char * strcpy( char * dest, const char * src ){char * begin = dest; // 指向 目的儲存空間 的 開始。while ( ( *dest++ = *src++) != ‘\0‘ ) // 逐字元儲存內容。s; // nothingreturn begin;}// 字串拷貝。 將 src 指定長度的內容 拷貝到 dest 中。char * strncpy( char  * dest, const char * src, size_t count ){char * move = dest;while ( count ){if ( ( *move = *src ) != ‘\0‘ )src++;move++;count--;}return dest;}// 字串拼接, 將 src 內容 拷貝到 dest 的後面char * strcat( char * dest, const char * src ){char * begin = dest;while ( *dest ) dest++; // while ( ( *dest++ = *src++ ) != ‘\0‘ ); // do nothingreturn begin;}// 字串拼接, 將 src 指定長度的內容 拷貝到 dest 的後面char * strncat( char * dest, const char * src, size_t count ){char * begin = dest;while ( *dest ) dest++; // while ( ( *dest++ = *src++ ) != ‘\0‘ ){if ( --count == 0 ){*dest= ‘\0‘;break;}}; // do nothingreturn begin;}// 比較2個字串。 傳回值: 0, -1, 1int strcmp( const char * s1, const char * s2 ){unsigned char c1, c2;while ( 1 ){c1 = *s1++;c2 = *s2++;if ( c1 != c2)return ( c1 < c2 ) ? -1 : 1; // 不相等 返回 -1 1if ( !c1 ) // 如果c1 已抵達末尾break;}return 0; // 相等返回 0 }// 指定長度的2個字串比較。 返回 0 -1 1int strncmp( const char * s1, const char * s2, size_t count ){unsigned char c1, c2;while ( count ){c1 = *s1++;c2 = *s2++;if ( c1 != c2 )return ( c1 < c2 ) ? -1 : 1; // 不相等 返回 -1 1if ( !c1 )break;count--; // 長度減1}return 0; // 相等返回 0}// 將 s 內長度為count 的內容 用c 來初始化svoid * memset( void *s, int c, size_t count ){char * xs = (char *)s;while ( count-- )*xs++ = c;return s;}// 將 src 內count長度內容 拷貝到 dest 中void * memcpy( void * dest, const void * src, size_t count ){char * tmp = (char *)dest;const char * s = (const char *)src;while ( count-- )*tmp++ = *s++;return dest;}// 比較 s1 s2大小, 返回一個整數int memcmp( const void * s1, const void *s2, size_t count ){const unsigned char * su1 = (const unsigned char *)s1;const unsigned char * su2 = (const unsigned char *)s2;int res = 0;for ( ; count > 0; ++su1, ++su2, --count ) {if ( ( res = *su1 - *su2 ) != 0 ) // 不相等,則跳出迴圈。break;}return res;}

  

string.h c源碼實現

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.