C语言-字符串函数和内存函数(简单整理)

一.字符串函数

1.strlen函数

函数原型:size_t strlen(const char* str)

功能:统计str字符串的长度。统计的是字符串中\0之前字符的个数。

头文件:<string.h>

返回值:返回了str指向的字符串的长度。

2.strcpy函数

函数原型:char* strcpy(char* dest,const char* src)

函数功能:字符串拷贝,拷贝到源字符串的\0为止。

参数:dest - 指针,指向目的地空间,指向源头数据。

返回值:strcpy返回的是目表空间的起始地址。

头文件 - <string.h>

代码演示:

复制代码
#include <stdio.h>
#include <string.h>  

int main(void)
{
    // 定义源字符串(要复制的内容)
    char src[] = "Hello C Language";
    // 目标字符数组,空间必须大于等于源字符串长度+1(存放结束符'\0')
    char dest[50];

    // strcpy(目标地址, 源地址):把src完整复制到dest,包含末尾'\0'
    strcpy(dest, src);

    printf("源字符串:%s\n", src);
    printf("复制后目标字符串:%s\n", dest);

    return 0;
}

3.strcat函数

函数原型: const* stract(char* dest,const char* src)

函数功能:字符串拼接,把src指向的源字符串的所有字符拼接到dest指向的空间中。

参数 :dest - 指针,只想目的地空间。 src - 指针,指向源头数据。

返回值:strcat 函数返回的目标空间的起始地址。

头文件<string.h>

头文件:<string.h>

复制代码
#include <stdio.h>
#include <string.h>  

int main() {
    
    char dest[50] = "Hello, ";  // 目标字符串
    char src[] = "World!";      // 待拼接的源字符串

    printf("拼接前dest:%s\n", dest);

    // strcat(目标字符串, 源字符串)
    strcat(dest, src);

    printf("拼接后dest:%s\n", dest);

    return 0;
}

4.strcmp函数

函数原型:int strcmp ( const char * str1, const char * str2 )

功能:用来比较str1 和str2 指向的字符串,从两个字符串的第一个字符开始比较,如果两个字符
的ASCII码值相等,就比较下一个字符。直到遇到不相等的两个字符,或者字符串结束。
参数

参数:str1-指针,指向要比较的第一个字符串。str2指针,只想要比较的第二个字符串。

复制代码
#include <stdio.h>
#include <string.h>  // strcmp头文件

int main()
{
    char str1[] = "abc";
    char str2[] = "abd";
    char str3[] = "abc";
    char str4[] = "ab";

    /*
    strcmp规则:
    1. 两个字符串逐字符比较ASCII值
    2. 相等返回0;str1>str2返回正数;str1<str2返回负数
    */
    int res1 = strcmp(str1, str2);
    int res2 = strcmp(str1, str3);
    int res3 = strcmp(str4, str1);

    printf("abc vs abd 结果:%d\n", res1);  // c < d,负数
    printf("abc vs abc 结果:%d\n", res2);  // 完全相等,0
    printf("ab vs abc 结果:%d\n", res3);   // 短字符串更小,负数

    return 0;
}

5.strncpy,stncmp,strncat

具体作用和前三者没什么区别,就是后面加了一个num来限制字节数,使用起来更加安全,这里就不一一赘述了。

二.内存函数

1.memcpy函数

函数原型:void* memcpy(void* dest,const void* src,size_t num)

函数功能:memcpy只负责完成存储拷贝,不关注内存数据存放的类型,函数memcpy从src开始向后复制num个字节到dest指向的位置上。

参数:dest - 指针,指向目标空间,拷贝的数据存放在这里。

src - 指针,指向源空间,要拷贝的数据从这里来。

num - 要拷贝的数据占用的字节数。

头文件:<string.h>

复制代码
#include <stdio.h>
#include <string.h>  

int main()
{
    // 源数组
    int src[5] = { 10,20,30,40,50 };
    // 目标数组,初始全0
    int dest[5] = { 0 };

    // 参数:目标地址,源地址,拷贝字节总数
    // int占4字节,拷贝3个int:3 * sizeof(int)
    memcpy(dest, src, 3 * sizeof(int));

    printf("拷贝后dest数组:");
    for (int i = 0; i < 5; i++)
    {
        printf("%d ", dest[i]);
    }
    // 输出:10 20 30 0 0
    return 0;
}

2.memmove函数

函数原型:void* memmove(void* dest,const* src,size_t num)

函数功能:和memmcpy一样,memmove也是用来完成内存拷贝的函数,只不过它的原内存和目标内存是可以重叠的。

参数: dest - 指针,指向目标空间,拷贝的数据存放在这里。

src - 指针,指向源空间,要拷贝的数据从这里来。

num - 要拷贝的数据占的字节数。

头文件:<string.h>

复制代码
#include <stdio.h>
#include <string.h>

int main()
{
    // 源数组,存在内存重叠场景
    char buf[] = "123456789";
    printf("移动前:%s\n", buf);

    // 场景1:无重叠复制
    char dest[20] = { 0 };
    memmove(dest, buf, 5); // 把buf前5字节复制到dest
    printf("无重叠复制结果:%s\n", dest);

    // 场景2:内存重叠(源地址 < 目标地址,向后覆盖)
    memmove(buf + 2, buf, 5); // 从buf[0]复制5字节到buf[2]
    printf("重叠后:%s\n", buf);

    return 0;
}

三.memset函数

函数原型: void * memset ( void * ptr, int value, size_t num )

函数功能:用来设定内存块内容,将内存中指定长度的空间设置为特定的内容。

参数:ptr - 指针,只向要设置的内存空间,也就是要放置内存空间的起始地址。

value - 填充的字节值。 num - 填充字节个数。

头文件: <string.h>

复制代码
#include <stdio.h>
#include <string.h>  // memset头文件

int main()
{
    // 1.char数组演示
    char str[10];
    // 参数1:内存起始地址;参数2:填充字节值;参数3:填充字节总数
    memset(str, 0, sizeof(str));
    printf("char数组第一个值:%d\n", str[0]); // 输出0,全部清零

    // 2.int数组清零
    int arr[5] = { 1,2,3,4,5 };
    memset(arr, 0, sizeof(arr));
    printf("int数组第一个值:%d\n", arr[0]); // 输出0

    // 3.踩坑示例:int数组填1,结果不是1
    int num[2];
    memset(num, 1, sizeof(num));
    printf("错误赋值num[0] = %d\n", num[0]); // 输出16843009,每个字节0x01拼接

    // 4.填充0xff(字节全1)
    short test[2];
    memset(test, 0xff, sizeof(test));
    printf("全1短整型:%d\n", test[0]); // 输出-1

    return 0;

四.memcmp函数

函数原型 : int memcmp ( const void * ptr1, const void * ptr2, size_t num )

函数功能:比较指定的两块内存块的内容,比较从ptr1和ptr2指针指向的位置开始,向后的num个字节。

参数:ptr1 :指针,指向一块待比较的内存块
ptr2 :指针,指向另外一块待比较的内存块
num :指定的比较长度,单位是字节

头文件:<string.h>

复制代码
#include <stdio.h>
#include <string.h>  // memcmp头文件

int main()
{
    // 两组字符串缓冲区
    char buf1[] = "apple123";
    char buf2[] = "apple456";

    // 比较前5个字节 "apple",内容一致返回0
    int res1 = memcmp(buf1, buf2, 5);
    printf("前5字节比较结果:%d\n", res1);

    // 比较全部字节,第6位'1' < '4',返回负数
    int res2 = memcmp(buf1, buf2, sizeof(buf1));
    printf("全部字节比较结果:%d\n", res2);

    // 整数数组测试,memcmp只对比内存字节
    int num1[] = { 1, 2, 3 };
    int num2[] = { 1, 2, 3 };
    int res3 = memcmp(num1, num2, sizeof(num1));
    printf("整型数组对比结果:%d\n", res3);

    return 0;
}

如果有错误的地方,欢迎大家指正!