服务器之家

服务器之家 > 正文

C语言字符函数与字符串函数详解

时间:2022-01-07 14:03     来源/作者:再吃一个橘子

本章重点

重点介绍处理字符和字符串的库函数的使用和注意事项

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 );

C语言字符函数与字符串函数详解

  • 源字符串必须以 '\0' 结束。
  • 会将源字符串中的 '\0' 拷贝到目标空间。
  • 目标空间必须足够大,以确保能存放源字符串。
  • 目标空间必须可变。( 即:不能是不可修改的常量字符串 )
  • 学会模拟实现。

讲解:

注意点1:

我们发现,copy时,将源字符串毫无保留的( 包括末尾的 '\0' )一块copy到目标字符串中!!

C语言字符函数与字符串函数详解

注意点2:

如果源字符串中间本身就含有'\0',那么我们同样还是取到遇见的第一个‘\0' ,不会继续往后打印的!!!

C语言字符函数与字符串函数详解

注意点3:

目标空间必须足够大,以确保能存放源字符串。

?
1
2
3
4
5
//错误示范
//目标字符串空间太少
char arr1[] = "xxx";
char arr2[] = "hello\0abc";
strcpy(arr1, arr2);

注意点4:

目标空间必须可变。

C语言字符函数与字符串函数详解

模拟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

相关文章

热门资讯

蜘蛛侠3英雄无归3正片免费播放 蜘蛛侠3在线观看免费高清完整
蜘蛛侠3英雄无归3正片免费播放 蜘蛛侠3在线观看免费高清完整 2021-08-24
yue是什么意思 网络流行语yue了是什么梗
yue是什么意思 网络流行语yue了是什么梗 2020-10-11
背刺什么意思 网络词语背刺是什么梗
背刺什么意思 网络词语背刺是什么梗 2020-05-22
2020微信伤感网名听哭了 让对方看到心疼的伤感网名大全
2020微信伤感网名听哭了 让对方看到心疼的伤感网名大全 2019-12-26
2021年耽改剧名单 2021要播出的59部耽改剧列表
2021年耽改剧名单 2021要播出的59部耽改剧列表 2021-03-05
返回顶部