C语言库函数的模拟实现与使用(面试常考)
1.strlen()的使用与模拟实现
#include <assert.h>
#include <string.h>
#include <stdio.h>
int main ( )
{
int len = strlen ( "abcdef" ) ;
printf ( "%d\n" , len) ;
}
int my_strlen ( const char * str)
{
assert ( str) ;
int count = 0 ;
while ( * str!= '0' )
{
count++ ;
str++ ;
}
return count;
}
int main ( )
{
int len = my_strlen ( "abcdef" ) ;
printf ( "%d\n" , len) ;
return 0 ;
}
2.strcpy()的使用与模拟实现
int main ( )
{
char arr1[ ] = { 'a' , 'b' , 'c' , 'd' , 'e' , 'f' } ;
char arr2[ 20 ] = "xxxxxxxx" ;
char arr3[ 3 ] = { 0 } ;
strcpy ( arr2, arr1) ;
strcpy ( arr3, arr1) ;
printf ( "%s\n" , arr2) ;
return 0 ;
}
char * my_strcpy ( char * dest, const char * src)
{
char * ret = dest;
assert ( dest && src) ;
while ( * ret)
{
* dest = * src;
dest++ ;
src++ ;
}
return ret;
}
int main ( )
{
char arr1[ ] = { 'a' , 'b' , 'c' , 'd' , 'e' , 'f' , '\0' } ;
char arr2[ 20 ] = "xxxxxxxxxxxx" ;
my_strcpy ( arr2, arr1) ;
printf ( "%s\n" , arr2) ;
return 0 ;
}
3.strcat()的使用与模拟实现
int main ( )
{
char arr1[ 30 ] = "hello" ;
char arr2[ ] = " world" ;
char arr3[ ] = { ' ' , 'w' , 'o' , 'r' , 'l' , 'd' } ;
strcat ( arr1, arr2) ;
strcat ( arr1, arr3) ;
printf ( "%s\n" , arr1) ;
return 0 ;
}
char * my_strcat ( char * dest, const char * src)
{
char * ret = dest;
assert ( dest && src) ;
while ( * dest)
{
dest++ ;
}
while ( * dest++ = * src++ )
{
;
}
return ret;
}
int main ( )
{
char arr1[ 30 ] = "hello" ;
char arr2[ ] = "world" ;
printf ( "%s\n" , my_strcat ( arr1, arr2) ) ;
return 0 ;
}
4.strcmp()的使用与模拟实现
int main ( )
{
char arr1[ ] = "abcdef" ;
char arr2[ ] = "abbq" ;
int ret = strcmp ( arr1, arr2) ;
printf ( "%d\n" , ret) ;
return 0 ;
}
int my_strcmp ( const char * str1, const char * str2)
{
assert ( str1 && str2) ;
while ( * str1 == * str2)
{
if ( * str1 == '\0' )
return 0 ;
str1++ ;
str2++ ;
}
if ( * str1 > * str2)
return 1 ;
else
return - 1 ;
return * str1 - * str2;
}
int main ( )
{
char arr1[ ] = "abcd" ;
char arr2[ ] = "abc" ;
int ret = my_strcmp ( arr1, arr2) ;
if ( ret< 0 )
{
printf ( "arr1<arr2" ) ;
}
else if ( ret > 0 )
{
printf ( "arr1>arr2" ) ;
}
else
{
printf ( "arr1==arr2" ) ;
}
return 0 ;
}
5.strncpy()的使用
int main ( )
{
char arr1[ ] = "xxxxxxxxxx" ;
char arr2[ ] = "hello" ;
int ret = strncmp ( arr1, arr2, 5 ) ;
printf ( "%d\n" , ret) ;
char arr1[ 20 ] = "hello\0xxxxxxx" ;
char arr2[ ] = "world" ;
strncat ( arr1, arr2, 7 ) ;
printf ( "%s\n" , arr1) ;
strncpy ( arr1, arr2, 5 ) ;
printf ( "%s\n" , arr1) ;
return 0 ;
}
6.strncat()的使用
int main ( )
{
char arr1[ 20 ] = "hello" ;
char arr2[ ] = "world" ;
strncat ( arr1, arr2, 3 ) ;
printf ( "%s\n" , arr1) ;
strncat ( arr1, arr2, 7 ) ;
printf ( "%s\n" , arr1) ;
return 0 ;
}
7.strncmp()的使用
int main ( )
{
char arr1[ ] = "abcdef" ;
char arr2[ ] = "abcqqqq" ;
int ret = strcmp ( arr1, arr2, 3 ) ;
printf ( "%d\n" , ret) ;
int ret2 = strcmp ( arr1, arr2, 4 ) ;
printf ( "%d\n" , ret2) ;
return 0 ;
}
8.strstr()的使用与模拟实现
int main ( )
{
char arr1[ ] = "abcdefabcdef" ;
char arr2[ ] = "bcd" ;
char * ret = strstr ( arr1, arr2) ;
if ( NULL == ret)
printf ( "没找到!\n" ) ;
else
printf ( "%s\n" , ret) ;
return 0 ;
}
char * my_strstr ( const char * str, const char * substr)
{
const char * s1 = str;
const char * s2 = substr;
const char * cur = str;
assert ( str && substr) ;
if ( * substr == '\0' )
{
return ( char * ) str;
}
while ( * cur)
{
s1 = cur;
s2 = substr;
while ( * s1 && * s2 && * s1 == * s2)
{
s1++ ;
s2++ ;
}
if ( * s2 == '\0' )
return ( char * ) cur;
cur++ ;
}
return NULL ;
}
int main ( )
{
char arr1[ ] = "abbbcdef" ;
char arr2[ ] = "bbcq" ;
char * ret = my_strstr ( arr1, arr2) ;
if ( NULL == ret)
printf ( "没找到\n" ) ;
else
printf ( "%s\n" , ret) ;
return 0 ;
}
9.strtok()的使用
int main ( )
{
const char * p = "@." ;
char arr[ ] = "jianbo@year.net" ;
char buf[ 50 ] = { 0 } ;
strcpy ( buf, arr) ;
char * str = NULL ;
for ( str = strtok ( buf, p) ; str != NULL ; str= strtok ( NULL , p) )
{
printf ( "%s\n" , str) ;
}
return 0 ;
}
#include <errno.h>
int main ( )
{
FILE* pf = fopen ( "test.txt" , "r" ) ;
if ( NULL == pf)
{
printf ( "%s\n" , strerror ( errno) ) ;
return 0 ;
}
fclose ( pf) ;
pf = NULL ;
return 0 ;
}
10.strerror()的使用
int main ( )
{
int i = 0 ;
for ( i = 0 ; i < 10 ; i++ )
{
printf ( "%d:%s\n" , i, strerror ( i) ) ;
}
return 0 ;
}
10.memcpy()的使用与模拟实现
int main ( )
{
test1 ( ) ;
char arr1[ ] = "abcdef" ;
char arr2[ 20 ] = { 0 } ;
strcpy ( arr2, arr1) ;
int arr3[ ] = { 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 } ;
int arr4[ 5 ] = { 0 } ;
memcpy ( arr4, arr3, 5 * sizeof ( arr3[ 0 ] ) ) ;
int i = 0 ;
for ( i = 0 ; i < 5 ; i++ )
{
printf ( "%d\n" , arr4[ i] ) ;
}
return 0 ;
}
void * my_memcpy ( void * dest, const void * src, size_t num)
{
void * ret = dest;
assert ( dest && src) ;
while ( num-- )
{
* ( char * ) dest = * ( char * ) src;
dest = ( char * ) dest + 1 ;
src = ( char * ) src + 1 ;
}
return ret;
}
void test1 ( )
{
int arr3[ ] = { 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 } ;
memmove ( arr3 + 2 , arr3, 20 ) ;
int i = 0 ;
for ( i = 0 ; i < 10 ; i++ )
{
printf ( "%d " , arr3[ i] ) ;
}
}
11.memmove()的使用与模拟实现
void * my_memmove ( void * dest, const void * src, size_t num)
{
void * ret = dest;
assert ( dest && src) ;
if ( dest < src)
{
while ( num-- )
{
* ( char * ) dest = * ( char * ) src;
dest = ( char * ) dest + 1 ;
src = ( char * ) src + 1 ;
}
}
else
{
while ( num-- )
{
* ( ( char * ) dest+ num) = * ( ( char * ) src + num) ;
}
}
return ret;
}
12.memcmp()的使用
int main ( )
{
int arr1[ ] = { 1 , 2 , 7 , 4 , 5 } ;
int arr2[ ] = { 1 , 2 , 3 , 4 , 5 } ;
int ret = memcmp ( arr1, arr2, 8 ) ;
printf ( "%d\n" , ret) ;
return 0 ;
}
13.memset()的使用
int main ( )
{
char arr[ 20 ] = { 0 } ;
memset ( arr, 'x' , 10 ) ;
int arr[ 10 ] = { 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 } ;
memset ( arr, 'x' , 10 ) ;
return 0 ;
}
14.atoi()的使用与模拟实现
int main ( )
{
int ret= atoi ( "123" ) ;
printf ( "%d\n" , ret) ;
return 0 ;
}
#include <stdlib.h>
#include <assert.h>
int my_atoi ( char * str)
{
int n = 0 ;
assert ( str) ;
while ( * str)
{
n = n * 10 + ( * str - '0' ) ;
str++ ;
}
return n;
}
int main ( )
{
int ret = atoi ( "123" ) ;
printf ( "%d\n" , ret) ;
return 0 ;
}
#include <ctype.h>
enum State
{
INVALID,
VALID
} ;
enum State status = INVALID;
int my_atoi ( const char * str)
{
assert ( str) ;
if ( * str == '\0' )
return 0 ;
while ( isspace ( * str) )
{
str++ ;
}
int flag = 1 ;
if ( * str == '+' )
{
str++ ;
flag = 1 ;
}
else if ( * str == '-' )
{
str++ ;
flag = - 1 ;
}
long long n = 0 ;
while ( isdigit ( * str) )
{
n = n * 10 + flag* ( * str - '0' ) ;
if ( n > INT_MAX || n < INT_MIN)
{
return 0 ;
}
str++ ;
}
if ( * str == '\0' )
{
status = VALID;
return ( int ) n;
}
return ( int ) n;
}
int main ( )
{
int ret = my_atoi ( " -111" ) ;
if ( status == VALID)
printf ( "%d\n" , ret) ;
else
printf ( "非法返回\n" ) ;
return 0 ;
}
扩展:qsort()的使用与模拟实现
struct Stu
{
char name[ 20 ] ;
int age;
float score;
} ;
void print_stu ( struct Stu arr[ ] , int sz)
{
int i = 0 ;
for ( i = 0 ; i < sz; i++ )
{
printf ( "%s %d %f\n" , arr[ i] . name, arr[ i] . age, arr[ i] . score) ;
}
printf ( "\n" ) ;
}
int cmp_int ( const void * e1, const void * e2)
{
return * ( int * ) e1 - * ( int * ) e2;
}
int cmp_stu_by_socre ( const void * e1, const void * e2)
{
if ( ( ( struct Stu* ) e1) -> score > ( ( struct Stu* ) e2) -> score)
{
return 1 ;
}
else if ( ( ( struct Stu* ) e1) -> score < ( ( struct Stu* ) e2) -> score)
{
return - 1 ;
}
else
{
return 0 ;
}
}
int cmp_stu_by_age ( const void * e1, const void * e2)
{
return ( ( struct Stu* ) e1) -> age - ( ( struct Stu* ) e2) -> age;
}
int cmp_stu_by_name ( const void * e1, const void * e2)
{
return strcmp ( ( ( struct Stu* ) e1) -> name, ( ( struct Stu* ) e2) -> name) ;
}
void test2 ( )
{
struct Stu arr[ ] = { { "zhangsan" , 20 , 87.5f } , { "lisi" , 22 , 99.0f } , { "wangwu" , 10 , 68.5f } } ;
int sz = sizeof ( arr) / sizeof ( arr[ 0 ] ) ;
qsort ( arr, sz, sizeof ( arr[ 0 ] ) , cmp_stu_by_name) ;
print_stu ( arr, sz) ;
}
int main ( )
{
int arr[ ] = { 1 , 4 , 2 , 6 , 5 , 3 , 7 , 9 , 0 , 8 } ;
int sz = sizeof ( arr) / sizeof ( arr[ 0 ] ) ;
bubble_sort ( arr, sz) ;
qsort ( arr, sz, sizeof ( arr[ 0 ] ) , cmp_int) ;
return 0 ;
}
void bubble_sort ( void * base, int sz, int width, int ( * cmp) ( const void * e1, const void * e2) )
{
int i = 0 ;
for ( i = 0 ; i < sz - 1 ; i++ )
{
int j = 0 ;
for ( j = 0 ; j < sz - 1 - i; j++ )
{
if ( cmp ( ( char * ) base + j * width, ( char * ) base + ( j + 1 ) * width) > 0 )
{
Swap ( ( char * ) base + j * width, ( char * ) base + ( j + 1 ) * width, width) ;
}
}
}
}
void Swap ( char * buf1, char * buf2, int width)
{
int i = 0 ;
for ( i = 0 ; i < width; i++ )
{
char tmp = * buf1;
* buf1 = * buf2;
* buf2 = tmp;
buf1++ ;
buf2++ ;
}
}
void test3 ( )
{
int arr[ ] = { 9 , 8 , 7 , 6 , 5 , 4 , 3 , 2 , 1 , 0 } ;
int sz = sizeof ( arr) / sizeof ( arr[ 0 ] ) ;
bubble_sort ( arr, sz, sizeof ( arr[ 0 ] ) , cmp_int) ;
print_arr ( arr, sz) ;
}
void test4 ( )
{
struct Stu arr[ ] = { { "zhangsan" , 20 , 87.5f } , { "lisi" , 22 , 99.0f } , { "wangwu" , 10 , 68.5f } } ;
int sz = sizeof ( arr) / sizeof ( arr[ 0 ] ) ;
bubble_sort ( arr, sz, sizeof ( arr[ 0 ] ) , cmp_stu_by_name) ;
print_stu ( arr, sz) ;
}