memcpy

作用:从源内存地址复制 src 到目标内存地址 dest,复制 n 个字节。

函数原型

void* memcpy(void* dest, const void* src, size_t n);

示例

#include <cstring>
#include <iostream>

int main() {
    int src[4] = {1, 2, 3, 4};
    int dest[4];

    memcpy(dest, src, sizeof(src));
    for (int i = 0; i < 4; ++i) {
        std::cout << dest[i] << " ";
     }
    std::cout << std::endl;
    return 0;
}

memmove

作用:类似于 memcpy,但可以处理源内存和目标内存重叠的情况。

函数原型

void* memmove(void* dest, const void* src, size_t n);

示例

#include <cstring>
#include <iostream>

int main() {
    char src[10] = "Hello World";
    char dest[10];

    memmove(dest, src, sizeof(src));
    std::cout << dest << std::endl;
    return 0;
}

memset

作用:将 s 所指向的 n 个字节都设置为 c

函数原型

void* memset(void* s, int c, size_t n);

示例

#include <cstring>
#include <iostream>

int main() {
    int arr[4];
    memset(arr, 0, sizeof(arr)); // 将数组初始化为0

    for (int i = 0; i < 4; ++i) {
        std::cout << arr[i] << " ";
    }
    std::cout << std::endl;
    return 0;
}

memcmp

作用:比较 s1s2 所指向的内存,比较的字节数为 n

函数原型

int memcmp(const void* s1, const void* s2, size_t n);

示例

#include <cstring>
#include <iostream>

int main() {
    char str1[5] = "abcd";
    char str2[5] = "abce";

    int result = memcmp(str1, str2, sizeof(str1));
    if (result < 0) {
        std::cout << "str1 is less than str2" << std::endl;
    } else if (result > 0) {
        std::cout << "str1 is greater than str2" << std::endl;
    } else {
        std::cout << "str1 is equal to str2" << std::endl;
    }
    return 0;
}

memchr 和 memrchr

作用memchr 搜索内存中第一次出现指定字符 c 的位置;memrchr 从后向前搜索。

函数原型

void* memchr(const void* s, int c, size_t n);
void* memrchr(const void* s, int c, size_t n);

示例

#include <cstring>
#include <iostream>

int main() {
    char str[] = "Hello World";
    char* result = memchr(str, 'W', sizeof(str));
    if (result) {
        std::cout << "Found 'W' at: " << result - str << std::endl;
    }
    return 0;
}

strncpy

作用:复制字符串,最多复制 n 个字符。

函数原型

char* strncpy(char* dest, const char* src, size_t n);

示例

#include <cstring>
#include <iostream>

int main() {
    char src[] = "Hello World";
    char dest[12];

    strncpy(dest, src, sizeof(dest) - 1);
    dest[sizeof(dest) - 1] = '\0'; // 确保字符串以空字符结尾

    std::cout << dest << std::endl;
    return 0;
}

strcat 和 strncat

作用strcat 连接两个字符串;strncat 可以指定最大连接的字符数。

函数原型

char* strcat(char* dest, const char* src);
char* strncat(char* dest, const char* src, size_t n);

示例

#include <cstring>
#include <iostream>

int main() {
    char str1[20] = "Hello ";
    char str2[] = "World";

    strcat(str1, str2);
    std::cout << str1 << std::endl;

    char str3[20] = "Hello ";
    strncat(str3, str2, 3);
    std::cout << str3 << std::endl;
    return 0;
}

strpbrk 和 strsep

作用strpbrk 根据一组分隔符分割字符串;strsep 根据分隔符分割字符串,返回分割后的字符串数组。

函数原型

char* strpbrk(const char* s, const char* delim);
char** strsep(char** sp, const char* delim);

示例

#include <cstring>
#include <iostream>

int main() {
    char str[] = "one,two,three";
    char* token = strtok(str, ",");
    while (token != nullptr) {
        std::cout << token << std::endl;
        token = strtok(nullptr, ",");
    }
    return 0;
}

strstr 和 strcasestr

作用strstr 搜索一个字符串在另一个字符串中第一次出现的位置;strcasestr 不区分大小写的字符串搜索。

函数原型

char* strstr(const char* haystack, const char* needle);
char* strcasestr(const char* haystack, const char* needle);

示例

#include <cstring>
#include <iostream>

int main() {
    const char haystack[] = "Hello World";
    const char needle[] = "world";

    char* pos = strstr(haystack, needle);
    if (pos) {
        std::cout << "Found at: " << pos - haystack << std::endl;
    }
    return 0;
}

strlen

作用:计算字符串的长度(不包括终止空字符)。

函数原型

size_t strlen(const char* s);

示例

#include <cstring>
#include <iostream>

int main() {
    const char str[] = "Hello";
    std::cout << "Length: " << strlen(str) << std::endl;
    return 0;
}

strtok

作用:分割字符串为多个部分。

函数原型

char* strtok(char* str, const char* delim);

示例

#include <cstring>
#include <iostream>

int main() {
    char str[] = "one,two,three";
    char* token = strtok(str, ",");
    while (token != nullptr) {
        std::cout << token << std::endl;
        token = strtok(nullptr, ",");
    }
    return 0;
}

这些函数是 C 和 C++中处理内存和字符串的基础工具。使用它们时,需要特别注意边界条件和潜在的溢出问题,以避免安全漏洞。在 C++中,建议使用标准库提供的更安全的函数和类,如 std::string 和智能指针,来减少直接操作内存的需求。

Logo

火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。

更多推荐