本章重点
重点介绍处理字符和字符串的库函数的使用和注意事项
1.求字符串长度 strlen
2.长度不受限制的字符串函数 strcpy ,strcat, strcmp
3.长度受限制的字符串函数 strncpy,strncat ,strncmp
4.字符串查找 strstr,strtok
5.错误信息报告 strerror
6.字符操作
7.内存操作函数 memcpy,memmove,memset ,memcmp
前言
C语言中对字符和字符串的处理很是频繁,但是C语言本身是没有字符串类型的,字符串通常放在 常量字符串 中或者 字符数组 中。 字符串常量 适用于那些对它不做修改的字符串函数。
1.strlen函数
size_t strlen ( const char * str );
- 字符串已经 '\0' 作为结束标志,strlen函数返回的是在字符串中 '\0' 前面出现的字符个数(不包含 '\0' )。
- 参数指向的字符串必须要以 '\0' 结束。
- 注意函数的返回值为size_t,是无符号的( 易错 )
- 学会strlen函数的模拟实现 (计数器、指针-指针、递归)
讲解:
注意点1
有的编译器可能用int来接收strlen函数的返回值会报错,因为strlen函数返回值是size_t( unsigned int 无符号整型 )
1
2
3
4
5
|
char arr[] = "abcdef" ;
//错误示范
int sz1 = strlen (arr);
//正确示范
size_t sz = strlen (arr);
|
注意点2
注意函数的返回值为size_t,是无符号的( 易错 )
1
2
3
4
5
6
7
8
9
10
11
12
13
|
//3 - 8 < 0?
//strlen函数是size_t类型,是无符号的,必定大于0!!!
int main()
{
if ( strlen ( "abc" ) - strlen ( "abcdefgh" ) > 0)
{
printf ( "哈哈哈~~" );
}
else
printf ( "吼吼吼!" );
return 0;
}
//运行结果是 哈哈哈~~
|
对比代码:
1
2
3
4
5
6
7
8
9
10
11
|
int main()
{
if (( int ) strlen ( "abc" ) - ( int ) strlen ( "abcdefgh" ) > 0)
{
printf ( "哈哈哈~~" );
}
else
printf ( "吼吼吼!" );
return 0;
}
//运行结果是 吼吼吼!
|
2.strcpy
char* strcpy(char * destination, const char * source );
- 源字符串必须以 '\0' 结束。
- 会将源字符串中的 '\0' 拷贝到目标空间。
- 目标空间必须足够大,以确保能存放源字符串。
- 目标空间必须可变。( 即:不能是不可修改的常量字符串 )
- 学会模拟实现。
讲解:
注意点1:
我们发现,copy时,将源字符串毫无保留的( 包括末尾的 '\0' )一块copy到目标字符串中!!
注意点2:
如果源字符串中间本身就含有'\0',那么我们同样还是取到遇见的第一个‘\0' ,不会继续往后打印的!!!
注意点3:
目标空间必须足够大,以确保能存放源字符串。
1
2
3
4
5
|
//错误示范
//目标字符串空间太少
char arr1[] = "xxx" ;
char arr2[] = "hello\0abc" ;
strcpy (arr1, arr2);
|
注意点4:
目标空间必须可变。
模拟strcpy函数
代码1:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
#include<stdio.h>
#include<assert.h>
void * my_strcpy( char * dest, const char * src)
{
assert (dest && src);
char * ret = dest;
while (*src)
{
*dest = *src;
dest++;
src++;
}
*dest = '\0' ;
}
int main()
{
char arr1[] = "xxxxxxxxxxxxxxxx" ;
char arr2[] = "abc" ;
my_strcpy(arr1, arr2);
printf ( "%s" , arr1);
return 0;
}
|
代码2:(升级版~~)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
#include<stdio.h>
#include<assert.h>
char * my_strcpy( char * dest, const char * src)
{
assert (dest && src);
char * ret = dest;
while (*dest++ = *src++)
{
;
}
return ret;
}
int main()
{
char arr1[] = "xxxxxxxxxxxxxxxx" ;
char arr2[] = "abc" ;
printf ( "%s" , my_strcpy(arr1, arr2));
return 0;
}
|
总结
本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注服务器之家的更多内容!
原文链接:https://blog.csdn.net/weixin_52377137/article/details/120313898