1、strlen函数
size_t strlen ( const char * str );
strlen函数统计的是字符串\0之前的字符个数(不包含 ‘\0’ ) strlen函数的返回值类型是 size_t(无符号整型) 参数指向的字符串必须要以 ‘\0’ 结束
(1)strlen函数介绍
# define _CRT_SECURE_NO_WARNINGS 1
# include <stdio.h>
# include <string.h>
int main ( )
{
char arr1[ ] = "abc\0def" ;
char arr2[ 3 ] = { 'a' , 'b' , 'c' } ;
int len1 = strlen ( arr1) ;
int len2 = strlen ( arr2) ;
printf ( "%d\n" , len1) ;
printf ( "%d\n" , len2) ;
if ( strlen ( "abc" ) - strlen ( "abcdef" ) > 0 )
{
printf ( ">\n" ) ;
}
else
{
printf ( "<=\n" ) ;
}
return 0 ;
}
(2)模拟实现strlen函数的3种方法
# define _CRT_SECURE_NO_WARNINGS 1
# include <stdio.h>
# include <assert.h>
int my_strlen ( const char * str)
{
int count = 0 ;
assert ( str) ;
while ( * str != '\0' )
{
count++ ;
str++ ;
}
return count;
}
int my_strlen ( const char * str)
{
assert ( str) ;
if ( * str != '\0' )
return 1 + my_strlen ( str + 1 ) ;
else
return 0 ;
}
int my_strlen ( const char * str)
{
assert ( str) ;
char * start = str;
while ( * str != '\0' )
{
str++ ;
}
return str - start;
}
int main ( )
{
char arr[ ] = "bit" ;
int len = my_strlen ( arr) ;
printf ( "%d\n" , len) ;
return 0 ;
}
2、strcpy函数
char* strcpy(char * destination, const char * source );
源字符串必须以 ‘\0’ 结束 会将源字符串中的 ‘\0’ 拷贝到目标空间 目标空间必须足够大,以确保能存放源字符串 目标空间必须可变
(1)strcpy函数介绍
# define _CRT_SECURE_NO_WARNINGS 1
# include <stdio.h>
# include <string.h>
int main ( )
{
char arr1[ 20 ] = { 0 } ;
char arr2[ ] = "hehe" ;
strcpy ( arr1, arr2) ;
printf ( "%s\n" , arr1) ;
char * p = "abcdefghi" ;
printf ( "%s\n" , p) ;
char ar1[ 20 ] = "abcdefghi" ;
char ar2[ 3 ] = "" ;
char a1[ ] = "qwertyuiop" ;
char a2[ 20 ] = { 0 } ;
return 0 ;
}
(2)模拟实现strcpy函数
# define _CRT_SECURE_NO_WARNINGS 1
# include <stdio.h>
# include <assert.h>
char * my_strcpy ( char * dest, const char * src)
{
char * ret = dest;
assert ( dest && src) ;
while ( * dest++ = * src++ )
{
;
}
return ret;
}
int main ( )
{
char arr1[ ] = "hehe" ;
char arr2[ 20 ] = { 0 } ;
printf ( "%s\n" , my_strcpy ( arr2, arr1) ) ;
return 0 ;
}
3、strcat函数
char * strcat ( char * destination, const char * source );
源字符串必须以 ‘\0’ 结束 目标空间必须有足够的大,能容纳下源字符串的内容 目标空间必须可修改 字符串不能自己给自己追加 从目标字符串的\0开始替换追加,至源字符串到\0结束追加
(1)strcat函数介绍
# define _CRT_SECURE_NO_WARNINGS 1
# include <stdio.h>
int main ( )
{
char arr1[ 20 ] = "hello \0xxxxxxxxx" ;
char arr2[ ] = "world" ;
strcat ( arr1, arr2) ;
printf ( "%s\n" , arr1) ;
return 0 ;
}
(2)模拟实现strcat函数
# define _CRT_SECURE_NO_WARNINGS 1
# include <stdio.h>
# include <assert.h>
char * my_strcat ( char * dest, const char * src)
{
assert ( dest && src) ;
char * ret = dest;
while ( * dest != '\0' )
{
dest++ ;
}
while ( * dest++ = * src++ )
{
;
}
return ret;
}
int main ( )
{
char arr1[ 20 ] = "hello " ;
char arr2[ ] = "world" ;
my_strcat ( arr1, arr2) ;
printf ( "%s\n" , arr1) ;
return 0 ;
}
4、strcmp函数
(1)strcmp函数介绍
strcmp函数比较的不是两字符串的长短,而是字符的ASCII码值 返回值小于0时返回的不一定是-1,返回值大于0时返回的不一定是1 返回值规则:
# define _CRT_SECURE_NO_WARNINGS 1
# include <stdio.h>
int main ( )
{
char arr1[ ] = "abq" ;
char arr2[ ] = "abq" ;
char arr3[ ] = "abqc" ;
char arr4[ ] = "abqd" ;
char arr5[ ] = "abqz" ;
char arr6[ ] = "abqa" ;
int ret1 = strcmp ( arr1, arr2) ;
int ret2 = strcmp ( arr3, arr4) ;
int ret3 = strcmp ( arr5, arr6) ;
printf ( "%d\n" , ret1) ;
printf ( "%d\n" , ret2) ;
printf ( "%d\n" , ret3) ;
return 0 ;
}
(2)模拟实现strcmp函数
# define _CRT_SECURE_NO_WARNINGS 1
# include <stdio.h>
# include <assert.h>
int my_strcmp ( const char * str1, const char * str2)
{
assert ( str1 && str2) ;
while ( * str1 == * str2)
{
if ( * str1 == '\0' )
{
return 0 ;
}
str1++ ;
str2++ ;
}
return * str1 - * str2;
}
int main ( )
{
char arr1[ ] = "abzqw" ;
char arr2[ ] = "abz" ;
int ret = my_strcmp ( arr1, arr2) ;
printf ( "%d\n" , ret) ;
return 0 ;
}
5、strncpy、strncat、strncmp函数
strncpy 可指定拷贝数量 strncat 可指定追加数量,可给自己追加 strncmp 可指定比较数量
# define _CRT_SECURE_NO_WARNINGS 1
# include <stdio.h>
int main ( )
{
char arr1[ ] = "abcdef" ;
char arr2[ 20 ] = "xxxxxxxxxx" ;
strncpy ( arr2, arr1, 3 ) ;
printf ( "%s\n" , arr2) ;
return 0 ;
}
int main ( )
{
char arr1[ 20 ] = "hello \0xxxxxxxxxx" ;
char arr2[ ] = "abcdef" ;
strncat ( arr1, arr2, 8 ) ;
printf ( "%s\n" , arr1) ;
return 0 ;
}
int main ( )
{
char arr1[ ] = "abcdef" ;
char arr2[ ] = "abcq" ;
int ret = strncmp ( arr1, arr2, 4 ) ;
printf ( "%d\n" , ret) ;
return 0 ;
}
int main ( )
{
char arr1[ ] = "abbq" ;
char arr2[ ] = "abbq" ;
int ret = strncmp ( arr1, arr2, 8 ) ;
printf ( "%d\n" , ret) ;
return 0 ;
}
6、模拟实现strstr函数
# define _CRT_SECURE_NO_WARNINGS 1
# include <stdio.h>
# include <assert.h>
char * my_strstr ( const char * str1, const char * str2)
{
assert ( str1 && str2) ;
char * s1 = NULL ;
char * s2 = NULL ;
char * cp = ( char * ) str1;
while ( * cp)
{
s1 = cp;
s2 = ( char * ) str2;
while ( * s1 && * s2 && * s1 == * s2)
{
s1++ ;
s2++ ;
}
if ( * s2 == '\0' )
{
return cp;
}
cp++ ;
}
return NULL ;
}
int main ( )
{
char arr1[ ] = "abcdebcdf" ;
char arr2[ ] = "bcd" ;
char * p = my_strstr ( arr1, arr2) ;
if ( p == NULL )
{
printf ( "找不到\n" ) ;
}
else
{
printf ( "%s\n" , p) ;
}
return 0 ;
}
7、strtok函数
char * strtok ( char * str, const char * sep );
sep参数是个字符串,定义了用作分隔符的字符集合 第一个参数指定一个字符串,它包含了0个或者多个由sep字符串中一个或者多个分隔符分割的内容 strtok函数找到str中的下一个标记,并将其用 \0 结尾,返回一个指向这个标记的指针(注:strtok函数会改变被操作的字符串,所以在使用strtok函数切分的字符串一般都是临时拷贝的内容并且可修改 ) strtok函数的第一个参数不为 NULL ,函数将找到str中第一个标记(即第一个被改为\0的位置),strtok函数将保存它在字符串中的位置 strtok函数的第一个参数为 NULL ,函数将在同一个字符串中被保存的位置开始,查找下一个标记 如果字符串中不存在更多的标记,则返回 NULL 指针
# define _CRT_SECURE_NO_WARNINGS 1
# include <stdio.h>
# include <string.h>
int main ( )
{
char arr[ ] = "192.168.3.212" ;
char buf[ 30 ] = { 0 } ;
strcpy ( buf, arr) ;
const char * p = "." ;
char * str = strtok ( buf, p) ;
printf ( "%s\n" , str) ;
str = strtok ( NULL , p) ;
printf ( "%s\n" , str) ;
str = strtok ( NULL , p) ;
printf ( "%s\n" , str) ;
str = strtok ( NULL , p) ;
printf ( "%s\n" , str) ;
printf ( "\n" ) ;
char arr1[ ] = "zpengwei@yeah.net" ;
char buf1[ 30 ] = { 0 } ;
strcpy ( buf1, arr1) ;
const char * p1 = "@." ;
char * str1 = NULL ;
for ( str1 = strtok ( buf1, p1) ; str1 != NULL ; str1 = strtok ( NULL , p1) )
{
printf ( "%s\n" , str1) ;
}
return 0 ;
}
8、strerror函数
返回错误码,所对应的错误信息 如果只是为了拿取错误信息,用 strerror ;若是想打印错误信息,可用 perror
# define _CRT_SECURE_NO_WARNINGS 1
# include <stdio.h>
# include <string.h>
int main ( )
{
char * p = strerror ( 0 ) ;
printf ( "%s\n" , p) ;
p = strerror ( 1 ) ;
printf ( "%s\n" , p) ;
p = strerror ( 2 ) ;
printf ( "%s\n" , p) ;
p = strerror ( 3 ) ;
printf ( "%s\n" , p) ;
return 0 ;
}
(1)strerror(errno)
想根据错误返回的 errno 码来 strerror 判断错误原因,需要加#include <errno.h>
头文件
# define _CRT_SECURE_NO_WARNINGS 1
# include <stdio.h>
# include <string.h>
# include <errno.h>
int main ( )
{
FILE* pf = fopen ( "test.txt" , "r" ) ;
if ( pf == NULL )
{
printf ( "打开文件失败,原因是:%s\n" , strerror ( errno) ) ;
return 1 ;
}
fclose ( pf) ;
pf = NULL ;
return 0 ;
}
(2)perror
perror 类似 printf + strerror,直接打印错误信息
# define _CRT_SECURE_NO_WARNINGS 1
# include <stdio.h>
# include <string.h>
# include <errno.h>
int main ( )
{
FILE* pf = fopen ( "test.txt" , "r" ) ;
if ( pf == NULL )
{
perror ( "打开文件失败" ) ;
return 1 ;
}
fclose ( pf) ;
pf = NULL ;
return 0 ;
}