字符串和内存函数(1)

简介: 字符串和内存函数(1)

strcat函数

image.png
如上图,strcat函数就是将一个字符串拼接在另一个字符串后面,第一个参数是目标字符串,第二个参数是源字符串,strcat的返回值是目标字符串的起始地址。

注意:1.目标空间必须足够大,还需要可以修改。

       2.目标空间必须得有\0(保证能找到目标空间的末尾)

       3.原字符串中也得有\0,在拷贝时将源字符串中的\0也拷贝过去。

如下图,准备拷贝时在目标字符串第一个\0的位置就开始拷贝。
image.png
下方代码是模拟实现strcat函数,请读者自行理解。

char* my_strcat(char* dest, const char* src)
{
   
    char* ret = dest;
    assert(dest && src);
    //找到目标空间的末尾
    while (*dest != '\0')
        dest++;
    //数据追加
    while (*dest++ = *src++);
    return ret;
}

strcmp函数

image.png
如上图,strcmp函数是用来比较两个字符串相对位置的字符的ASCII的大小的,如果相对位置的大小相同,就往后一位比较,直到有大小不同的字符就停止比较。

返回值如下:1.当参数1大于参数2,返回大于0的数。

                  2.当参数1等于参数2,返回0。

                  3.当参数1小于参数2,返回小于0的数。

下方是模拟strcmp函数的实现。

```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;
}

# strncpy函数

image.png
如上图,strncpy函数比strcpy函数多了一个参数,参数3是指参数2字符串拷贝的字符个数,在拷贝时,不会将参数2字符串末尾的\0拷贝过去。如果参数3的个数超过参数2的字符个数会发生什么呢?

image.png
image.png
如上图,超过的部分会自动补\0,所以最终只会打印abc。

strncat函数

image.png
image.png
如上图,strncat函数的参数3跟strncpy的参数3类似,都是指个数,不过在拷贝时,会自动拷贝一个\0在末尾。

ctrncmp函数

image.png
如上图, strncmp的参数3也是指个数,指的是两个字符串前num个相对位置的字符的大小,因为前三个字符都一样,所以返回值是0。

image.png
strstr会返回str1中str2第一次出现的位置,如果str1中没有str2,就返回NULL。strstr是一个在字符串中找字符串的函数。

下方是strstr函数的模拟实现和运行结果。
```const char my_strstr(const char str1,const char str2)
{
const char
cp;//记录开始匹配的位置
const char s1;//遍历str1指向的字符串
const char
s2;//遍历str2指向的字符串
assert(str1 && str2);
if (str2 == '\0')
return str1;
cp = str1;
while (
cp)
{
s1 = cp;
s2 = str2;
while (s1&&s2&&s1 == s2)
{
s1++;
s2++;
}
if (*s2 == '\0')
return cp;
cp++;
}
return NULL;
}

int main()
{
char arr1[] = "abbbcdef";
char arr2[] = "bbc";
const char ret = my_strstr(arr1, arr2);
if (ret == NULL)
printf("找不到\n");
else
printf("%s\n", ret);
return 0;
}
```
image.png
分析:为了不改变原始数据,我们创建了另外3个指针, cp指向str1的起始位置,s1用来遍历str1指向的字符串,每次循环结束(即查找失败)时,cp++使cp指向str1的下一位,再把cp赋给s1。s2用来遍历str2指向的字符串,每次循环结束,就要使s2回到str2的起始位置。内层while的条件中
s1&&s2用来判断他们是否已经遇到\0,如果遇到则停止,s1==s2用来判断相对应的字符是否相同,相同则继续。当s2==\0时表明s2已经到str2的末尾了,说明已经在str1中找到和str2一样的字符串了,这时就可以直接返回此时cp的位置。还有一种特殊的情况,等str2时空字符串时,即"",我们直接返回str1的起始地址,因为空集是任何一个集合的子集。

目录
相关文章
|
8天前
|
存储 算法 C语言
C库函数详解 - 内存操作函数:memcpy()、memmove()、memset()、memcmp() (一)
`memcpy()` 和 `memmove()` 是C语言中的两个内存操作函数。 `memcpy()` 函数用于从源内存区域复制指定数量的字节到目标内存区域。它不处理内存重叠的情况,如果源和目标区域有重叠,结果是未定义的。函数原型如下: ```c void *memcpy(void *dest, const void *src, size_t num); ```
26 6
|
4天前
|
存储 算法 C语言
C语言指针与二维数组在函数参数传递和动态内存管理中的应用
C语言指针与二维数组在函数参数传递和动态内存管理中的应用
13 0
|
5天前
|
C语言
C语言(11)----内存函数
C语言(11)----内存函数
10 1
字符串和内存函数(下)
字符串和内存函数(下)
|
5天前
|
C++
字符串和内存函数(上)
字符串和内存函数(上)
|
5天前
|
存储 测试技术 C语言
C语言内存管理函数研究
C语言内存管理函数研究
13 0
|
6天前
|
C语言
C语言内存操作函数
C语言内存操作函数
12 1
|
8天前
|
存储 C语言
C库函数详解 - 内存操作函数:memcpy()、memmove()、memset()、memcmp() (二)
`memset()`是一个C语言库函数,用于将指定内存区域的字节设置为特定值。函数原型为`void *memset(void *ptr, int value, size_t num)`,参数分别为指向内存起始位置的指针、要设置的值和设置的字节数。`memcmp()`函数则用于比较两个内存区域,返回值表示比较结果,原型为`int memcmp(const void *ptr1, const void *ptr2, size_t num)`。它比较指定字节数的内存,并根据比较结果返回整数值。
23 4
|
16天前
|
存储 算法 关系型数据库
实时计算 Flink版产品使用合集之在Flink Stream API中,可以在任务启动时初始化一些静态的参数并将其存储在内存中吗
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
93 4
|
17天前
|
存储 小程序 编译器
数据在内存中的存储(探索内存的秘密)
数据在内存中的存储(探索内存的秘密)
111 0