~C.库函数的介绍~

C语言函数序列之字符串函数模拟:strlen、strcpy、strcmp、strcat、strstr strlen、strcpy、strcat、strcmp、strstr函数的介绍和模拟 阅读详情

今天给小伙伴们带来的是C语言中一些库函数的详细介绍,使用方法以及使用时的一些注意事项@

函数介绍

1.strlen函数

strlen 是 C 语言标准库中的一个函数,用于计算以空字符 \0 结尾的字符串的长度。strlen 函数返回字符串中的字符数量,不包括最后的空字符。

函数原型如下:

size_t strlen(const char *str);
示例代码

以下是使用 strlen 函数的一个简单示例:

#include <stdio.h>
#include <string.h> // 包含 strlen 函数的头文件

int main()
 {
    char str[] = "Hello, World!";
    size_t length = strlen(str);

    printf("The length of the string is: %zu\n", length);

    return 0;
}

注意事项

  1. strlen 函数只计算直到遇到第一个空字符 \0 的字符数量。如果字符串中间有 \0,strlen 会在遇到第一个 \0 时停止计数。

  2. strlen 函数不检查字符串是否有效或是否越界,因此使用时需要确保传入的字符串是有效的 C 字符串(以 \0 结尾)。

  3. strlen 函数返回的是 size_t 类型,这是一个无符号整数类型,通常用于表示大小和计数。

  4. 在多字节字符集中(如 UTF-16 或 UTF-32),strlen 仍然只计算字节长度,而不是字符数量。对于宽字符字符串,应使用 wcslen 函数。

  5. strlen 函数的时间复杂度是 O(n),其中 n 是字符串的长度,因为它需要遍历整个字符串直到找到空字符。

2.strcpy 函数

strcpy 是 C 语言标准库中的一个函数,用于复制字符串。它将源字符串(包括 \0 结尾符)复制到目标字符串中。strcpy 函数不检查目标数组的大小,因此如果目标数组不够大,可能会导致缓冲区溢出,这是潜在的安全风险。

函数原型如下:

char *strcpy(char *dest, const char *src);

//dest:指向目标字符串的指针,该函数会将 src 字符串的内容复制到 dest 指向的内存位置。
//src:指向源字符串的指针,strcpy 函数会复制该字符串的内容,包括空字符 \0。

返回值

strcpy 函数返回目标字符串 dest 的指针。

示例代码

以下是使用 strcpy 函数的一个简单示例:

#include <stdio.h>
#include <string.h> // 包含 strcpy 函数的头文件

int main() {
    char src[] = "Hello, World!";
    char dest[20]; // 确保目标数组足够大以存储 src 字符串

    strcpy(dest, src);

    printf("Copied string: %s\n", dest);

    return 0;
}

注意事项

  1. 缓冲区溢出:使用 strcpy 时必须确保目标数组有足够的空间来存储源字符串,包括空字符 \0。

  2. 安全性:由于 strcpy 不执行任何边界检查,使用时需要特别小心。在可能的情况下,推荐使用 strncpy 或其他更安全的字符串操作函数。

  3. 重叠字符串:如果源字符串和目标字符串有重叠,strcpy 的行为是未定义的。在这种情况下,应使用 memmove 函数。

  4. 空终止符:strcpy 会复制源字符串的空终止符 \0,确保目标字符串正确地以 \0 结尾。

  5. 返回值:strcpy 返回目标字符串的指针,这可以用于链式操作,例如 strcpy(dest, src1); strcat(dest, src2);。

3.strcat函数

strcat 是 C 语言标准库中的一个函数,用于将两个字符串连接起来。它将源字符串(不包括空字符 \0)追加到目标字符串的末尾,并在连接后的字符串末尾添加空字符 \0。

函数原型如下:

char *strcat(char *dest, const char *src);
//dest:指向目标字符串的指针,该函数会将 src 字符串的内容追加到 dest 指向的内存位置。
//src:指向源字符串的指针,strcat 函数会复制该字符串的内容(不包括空字符 \0)

返回值

strcat 函数返回目标字符串 dest 的指针。

示例代码

以下是使用 strcat 函数的一个简单示例:

#include <stdio.h>
#include <string.h> // 包含 strcat 函数的头文件

int main() 
{
    char dest[20] = "Hello, ";
    char src[] = "World!";

    strcat(dest, src);

    printf("Concatenated string: %s\n", dest);

    return 0;
}

注意事项

  1. 缓冲区溢出:使用 strcat 时必须确保目标数组有足够的空间来存储两个字符串的连接结果,包括空字符 \0。

  2. 安全性:由于 strcat 不执行任何边界检查,使用时需要特别小心。在可能的情况下,推荐使用 strncat 或其他更安全的字符串操作函数。

  3. 重叠字符串:如果源字符串和目标字符串有重叠,strcat 的行为是未定义的。在这种情况下,应使用 memmove 函数。

  4. 空终止符:strcat 会保留目标字符串的空终止符 \0,并在连接后的字符串末尾添加新的空终止符。

  5. 返回值:strcat 返回目标字符串的指针,这可以用于链式操作。

  6. 性能:strcat 需要从目标字符串的开头扫描到末尾以找到第一个空字符,这可能会增加执行时间。如果已知目标字符串的长度,使用 strncat 可能更高效。

4.strcmp函数

strcmp 是 C 语言标准库中的一个函数,用于比较两个字符串。它按照字典顺序比较两个字符串,直到找到不相等的字符或遇到空字符 \0。

函数原型如下:

int strcmp(const char *str1, const char *str2);
//str1:指向第一个字符串的指针。
//str2:指向第二个字符串的指针。

返回值

strcmp 函数返回一个整数值,表示两个字符串的比较结果:

  • 如果 str1 小于 str2,则返回值小于 0。
  • 如果 str1 等于 str2,则返回值等于 0。
  • 如果 str1 大于 str2,则返回值大于 0。

示例代码

以下是使用 strcmp 函数的一个简单示例:

#include <stdio.h>
#include <string.h> // 包含 strcmp 函数的头文件

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

    int result1 = strcmp(str1, str2); // 比较 str1 和 str2
    int result2 = strcmp(str1, str3); // 比较 str1 和 str3

    if (result1 < 0) {
        printf("'%s' is less than '%s'\n", str1, str2);
    } else if (result1 > 0) {
        printf("'%s' is greater than '%s'\n", str1, str2);
    } else {
        printf("'%s' is equal to '%s'\n", str1, str2);
    }

    if (result2 == 0) {
        printf("'%s' is equal to '%s'\n", str1, str3);
    }

    return 0;
}

注意事项

  1. 大小写敏感:strcmp 是大小写敏感的,所以 "Hello" 和 "hello" 会被认为是不相等的。

  2. 非空终止字符串:strcmp 函数假设输入的字符串是以空字符 \0 结尾的。如果字符串不是以 \0 结尾的,strcmp 可能会读取内存中未定义的区域。

  3. 性能:strcmp 函数在找到第一个不相等的字符或空字符时停止比较,所以它的时间复杂度是 O(n),其中 n 是字符串的长度。

  4. 使用场景:strcmp 常用于字符串比较、排序和搜索等场景。

  5. 返回值:strcmp 的返回值可以用于条件语句和逻辑运算,因为它返回的是一个整数。

5.strncmp函数

strncmp 是 C 语言标准库中的一个函数,用于比较两个字符串的前 n 个字符。它在比较时考虑了字符串的字典顺序,并且可以限制比较的字符数,这使得它在处理字符串时更加灵活。

函数原型如下:

int strncmp(const char *str1, const char *str2, size_t n);
//str1:指向第一个字符串的指针。
//str2:指向第二个字符串的指针。
//n:要比较的最大字符数。

示例代码

以下是使用 strncmp 函数的一个简单示例:

#include <stdio.h>
#include <string.h> // 包含 strncmp 函数的头文件

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

    int result1 = strncmp(str1, str2, sizeof(str1) - 1); // 比较 str1 和 str2 的前 5 个字符
    int result2 = strncmp(str1, str3, sizeof(str1) - 1); // 比较 str1 和 str3 的前 5 个字符

    if (result1 < 0) {
        printf("'%s' is less than '%s'\n", str1, str2);
    } else if (result1 > 0) {
        printf("'%s' is greater than '%s'\n", str1, str2);
    } else {
        printf("'%s' is equal to '%s'\n", str1, str2);
    }

    if (result2 == 0) {
        printf("'%s' is equal to '%s'\n", str1, str3);
    }

    return 0;
}

注意事项

  1. 大小写敏感:strncmp 是大小写敏感的,所以 "Hello" 和 "hello" 会被认为是不相等的。

  2. 空终止符:strncmp 会在到达空字符 \0 或比较了 n 个字符后停止,以先到者为准。

  3. 性能:strncmp 的时间复杂度是 O(n),其中 n 是要比较的字符数。

  4. 返回值:strncmp 的返回值可以用于条件语句和逻辑运算,因为它返回的是一个整数。

  5. 安全性:在使用 strncmp 比较字符串时,确保不要超过字符串的实际长度,以避免未定义行为。

strncmp 函数是处理字符串比较任务的有用工具,尤其是在需要比较字符串的一部分或限制比较长度时。它提供了一种安全的方式来避免超出字符串边界的风险。

6.strncpy函数

strncpy 是 C 语言标准库中的一个函数,用于将字符串从源内存地址复制到目标内存地址,同时允许指定最大复制的字符数。与 strcpy 不同,strncpy 可以防止缓冲区溢出,因为它限制了复制的字符数。

函数原型如下:

char *strncpy(char *dest, const char *src, size_t n);
//dest:指向目标字符串的指针,数据将被复制到这个位置。
//src:指向源字符串的指针,数据将从这个位置复制。
//n:最大复制的字符数。

返回值

strncpy 函数返回一个指向目标字符串 dest 的指针。

示例代码

以下是使用 strncpy 函数的一个简单示例:

#include <stdio.h>
#include <string.h> // 包含 strncpy 函数的头文件

int main() 
{
    char src[] = "Hello, World!";
    char dest[20]; // 确保目标数组足够大以存储 src 字符串

    // 使用 strncpy 复制字符串,最多复制 13 个字符
    strncpy(dest, src, 13);

    // 确保目标字符串以空字符结尾
    dest[13] = '\0';

    printf("Copied string: %s\n", dest);

    return 0;
}

注意事项

  1. 空终止符:strncpy 不会自动添加空终止符 \0 如果源字符串的长度小于 n。因此,在使用 strncpy 后,通常需要手动设置空终止符。

  2. 剩余字符:如果源字符串的长度大于或等于 n,strncpy 将不会复制空终止符,并且目标字符串可能不以空字符结尾。

  3. 安全性:尽管 strncpy 可以减少缓冲区溢出的风险,但它仍然需要谨慎使用,特别是在确定目标数组大小和手动设置空终止符时。

  4. 返回值:strncpy 返回目标字符串的指针,这可以用于链式操作。

  5. 性能:strncpy 的时间复杂度是 O(n),其中 n 是要复制的字符数。

strncpy 是一个有用的函数,用于在复制字符串时控制最大字符数,但需要确保目标字符串正确地以空字符结尾。在可能的情况下,使用 strlcpy 或其他更安全的字符串操作函数可能是更好的选择。

7.strncat函数

strncat 是 C 语言标准库中的一个函数,用于将源字符串(不包括空字符 \0)追加到目标字符串的末尾,并在连接后的字符串末尾添加空字符 \0。与 strcat 不同,strncat 允许指定最大追加的字符数,这有助于防止缓冲区溢出。

函数原型如下:

char *strncat(char *dest, const char *src, size_t n);
//dest:指向目标字符串的指针,源字符串将被追加到这个位置。
//src:指向源字符串的指针,字符串将从这个位置复制。
//n:最大追加的字符数。

返回值

strncat 函数返回一个指向目标字符串 dest 的指针。

示例代码

以下是使用 strncat 函数的一个简单示例:

#include <stdio.h>
#include <string.h> // 包含 strncat 函数的头文件

int main() 
{
    char dest[20] = "Hello, ";
    char src[] = "World!";
    size_t n = 6; // 追加的字符数

    // 使用 strncat 追加字符串,最多追加 6 个字符
    strncat(dest, src, n);

    printf("Concatenated string: %s\n", dest);

    return 0;
}

注意事项

  1. 缓冲区溢出:尽管 strncat 允许指定最大追加的字符数,但仍需确保目标数组有足够的空间来存储两个字符串的连接结果,包括空字符 \0。

  2. 空终止符:strncat 会在连接后的字符串末尾添加空字符 \0,但如果 n 大于或等于 src 的长度,strncat 不会添加额外的空字符。

  3. 重叠字符串:如果源字符串和目标字符串有重叠,strncat 的行为是未定义的。在这种情况下,应使用 memmove 函数。

  4. 性能:strncat 的时间复杂度是 O(m+n),其中 m 是 dest 的长度,n 是追加的字符数。

  5. 返回值:strncat 返回目标字符串的指针,这可以用于链式操作。

strncat 是一个有用的函数,用于在追加字符串时控制最大追加的字符数,但需要确保目标字符串有足够的空间来存储结果。在可能的情况下,使用 strlcat 或其他更安全的字符串操作函数可能是更好的选择。

8.strstr函数

strstr 是 C 语言标准库中的一个函数,用于在一个字符串中查找第一次出现的另一个字符串,并返回第一次出现的位置。如果找不到子字符串,则返回 NULL。

函数原型如下:

char *strstr(const char *haystack, const char *needle);
//haystack:指向要搜索的字符串(主字符串)的指针。
//needle:指向要查找的子字符串的指针。

返回值

strstr 函数返回一个指向 haystack 中第一次出现 needle 的位置的指针。如果 needle 是空字符串,strstr 返回 haystack。如果 needle 在 haystack 中没有出现,则返回 NULL。

示例代码

以下是使用 strstr 函数的一个简单示例:

#include <stdio.h>
#include <string.h> // 包含 strstr 函数的头文件

int main() {
    char haystack[] = "Hello, World!";
    char needle1[] = "World";
    char needle2[] = "C++";

    char *result1 = strstr(haystack, needle1); // 在 haystack 中查找 needle1
    char *result2 = strstr(haystack, needle2); // 在 haystack 中查找 needle2

    if (result1 != NULL) {
        printf("'%s' found in '%s'\n", needle1, haystack);
    } else {
        printf("'%s' not found in '%s'\n", needle1, haystack);
    }

    if (result2 != NULL) {
        printf("'%s' found in '%s'\n", needle2, haystack);
    } else {
        printf("'%s' not found in '%s'\n", needle2, haystack);
    }

    return 0;
}

注意事项

  1. 大小写敏感:strstr 是大小写敏感的,所以 "Hello" 和 "hello" 会被认为是不同的字符串。

  2. 空字符串:如果 needle 是空字符串,strstr 返回 haystack 的指针。

  3. 重叠字符串:strstr 可以正确处理 haystack 和 needle 重叠的情况。

  4. 性能:strstr 的时间复杂度是 O(n*m),其中 n 是 haystack 的长度,m 是 needle 的长度。

  5. 返回值:strstr 的返回值是一个指针,可以用来进一步操作找到的子字符串。

  6. NULL 检查:在使用 strstr 的返回值之前,应该检查是否为 NULL,以避免解引用空指针。

strstr 函数是处理字符串搜索任务的有用工具,但使用时需要注意其性能和返回值的处理。

9.strtok函数

strtok 是 C 语言标准库中的一个函数,用于根据分隔符分割字符串。它是一个可重入的函数,可以在多次调用中使用,每次调用都会返回下一个分割后的子字符串。

函数原型如下:

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

//str:指向要分割的字符串的指针。在第一次调用时,str 应该是要分割的字符串的地址。在随后的调用中,str 应该是 NULL,以便函数继续处理上次调用后剩余的字符串。

//delim:指向定义分隔符集合的字符串。

返回值

strtok 函数返回一个指向下一个子字符串的指针。当没有更多的子字符串时,返回 NULL。

示例代码

以下是使用 strtok 函数的一个简单示例:

#include <stdio.h>
#include <string.h> // 包含 strtok 函数的头文件

int main()
 {
    char str[] = "Hello, World! This is a test.";
    char *token;
    const char *delim = " ,!";

    // 获取第一个子字符串
    token = strtok(str, delim);

    // 循环获取剩余的子字符串
    while (token != NULL) 
{
        printf("%s\n", token);
        token = strtok(NULL, delim); // 在后续调用中传递 NULL
    }

    return 0;
}

注意事项

  1. 线程安全:strtok 不是线程安全的,因为它使用了静态缓冲区来存储数据。在多线程环境中,应使用 strtok_r。

  2. 修改原字符串:strtok 会修改原始字符串,通过在每个分割的子字符串后面插入空字符 \0。

  3. 分隔符:strtok 会跳过分隔符,并返回第一个非分隔符字符开始的子字符串。

  4. 返回值:strtok 返回的指针指向的子字符串不应被修改,因为它们是原始字符串的一部分。

  5. NULL 检查:在使用 strtok 的返回值之前,应该检查是否为 NULL,以避免解引用空指针。

strtok 函数是处理字符串分割任务的有用工具,但使用时需要注意其对原字符串的修改和线程安全问题。在现代编程实践中,推荐使用 strtok_r 或其他更安全的替代函数。

10.strerror函数

strerror 是 C 语言标准库中的一个函数,它用于将整型错误码转换为对应的错误描述字符串。这个函数是处理错误时的有用工具,因为它提供了一种将系统错误码转换为可读字符串的方法。

函数原型如下:

char *strerror(int errnum);
//errnum:一个整型错误码,通常是 errno 变量的值,errno 是一个全局变量,用于存储最近一次库函数调用中发生的错误码。

返回值

strerror 函数返回一个指向错误描述字符串的指针。这个字符串是只读的,不应该被修改。

示例代码

以下是使用 strerror 函数的一个简单示例:

#include <stdio.h>
#include <string.h> // 包含 strerror 函数的头文件

int main() 
{
    char buffer[128];
    int result = strerror_r(ENOMEM, buffer, sizeof(buffer));

    if (result == 0) 
    {
        printf("Error: %s\n", buffer);
    } 
else 
    {
        printf("Failed to get error message.\n");
    }

    return 0;
}

注意事项

  1. 线程安全:strerror 函数是非线程安全的,因为它可能修改全局变量 errno。在多线程环境中,应使用 strerror_r,这是一个线程安全的替代函数。

  2. 错误描述字符串:返回的错误描述字符串是静态分配的,不应该被修改。

  3. 返回值:strerror 返回的是一个指向只读字符串的指针,这个字符串描述了对应的错误。

  4. 错误码:errnum 参数应该是一个有效的错误码,通常是 errno 变量的值。

  5. 可移植性:strerror 函数的行为在不同系统上可能略有不同,特别是在错误描述字符串的内容和语言上。

strerror 函数是处理错误时的有用工具,它提供了一种将系统错误码转换为人类可读字符串的方法。在多线程程序中,应优先考虑使用 strerror_r 以确保线程安全。

11.memcpy函数

memcpy 是 C 语言标准库中的一个函数,用于从源内存地址复制指定数量的字节到目标内存地址。这个函数在处理内存操作时非常有用,尤其是在需要精确控制数据复制时。

函数原型如下:

void *memcpy(void *dest, const void *src, size_t n);
//dest:指向目标内存块的指针,数据将被复制到这个位置。
//src:指向源内存块的指针,数据将从这个位置复制。
//n:要复制的字节数。

返回值

memcpy 函数返回一个指向目标内存块 dest 的指针。

示例代码

以下是使用 memcpy 函数的一个简单示例:

#include <stdio.h>
#include <string.h> // 包含 memcpy 函数的头文件

int main() 
{
    char src[] = "Hello, World!";
    char dest[20]; // 确保目标数组足够大以存储 src 字符串

    // 使用 memcpy 复制字符串
    memcpy(dest, src, sizeof(src));

    printf("Copied string: %s\n", dest);

    return 0;
}

注意事项

  1. 重叠区域:如果源和目标内存区域重叠,memcpy 的行为是未定义的。在这种情况下,应使用 memmove 函数。

  2. 内存对齐:memcpy 通常假设内存是适当对齐的,这可能影响性能。如果性能是关键考虑因素,并且数据类型不是字节对齐的,可能需要使用特定于数据类型的复制函数,如 memmove 或其他优化的函数。

  3. 空终止符:memcpy 不会自动添加空终止符 \0,如果复制的是字符串,需要手动处理空终止符。

  4. 返回值:memcpy 返回目标内存块的指针,这可以用于链式操作,例如 memcpy(dest, src, n); memset(dest + n, 0, m);。

  5. 类型安全:memcpy 本身不提供类型安全,因为它只处理字节级别的复制。确保目标和源的类型兼容,并且目标有足够的空间来接收复制的数据。

memcpy 是一个强大的工具,用于在内存中复制数据,但需要谨慎使用,以避免潜在的错误和安全问题。

12.memove函数

memmove 是 C 语言标准库中的一个函数,用于从源内存地址复制指定数量的字节到目标内存地址。与 memcpy 不同,memmove 可以处理源和目标内存区域重叠的情况,因为它在复制时考虑到了这种可能性。

函数原型如下:

void *memmove(void *dest, const void *src, size_t n);
//dest:指向目标内存块的指针,数据将被复制到这个位置。
//src:指向源内存块的指针,数据将从这个位置复制。
//n:要复制的字节数。

返回值

memmove 函数返回一个指向目标内存块 dest 的指针。

示例代码

以下是使用 memmove 函数的一个简单示例:

#include <stdio.h>
#include <string.h> // 包含 memmove 函数的头文件

int main() {
    char src[] = "Hello, World!";
    char dest[20]; // 确保目标数组足够大以存储 src 字符串

    // 使用 memmove 复制字符串
    memmove(dest, src, sizeof(src));

    printf("Copied string: %s\n", dest);

    return 0;
}

注意事项

  1. 重叠区域:memmove 可以安全地处理源和目标内存区域重叠的情况,这是它与 memcpy 的主要区别。

  2. 内存对齐:与 memcpy 一样,memmove 通常假设内存是适当对齐的。

  3. 空终止符:memmove 不会自动添加空终止符 \0,如果复制的是字符串,需要手动处理空终止符。

  4. 返回值:memmove 返回目标内存块的指针,这可以用于链式操作。

  5. 类型安全:与 memcpy 一样,memmove 不提供类型安全,因为它只处理字节级别的复制。确保目标和源的类型兼容,并且目标有足够的空间来接收复制的数据。

memmove 是一个有用的工具,特别是在需要复制的数据区域可能重叠时。它通过在复制过程中采取额外的步骤来确保数据的正确复制,即使在重叠的情况下也能安全使用。

13.memcmp函数

memcmp 是 C 语言标准库中的一个函数,用于比较两个内存区域。它逐字节比较两个内存块,直到比较完指定的字节数或发现不同。

函数原型如下:

int memcmp(const void *str1, const void *str2, size_t n);
//str1:指向第一个内存块的指针。
//str2:指向第二个内存块的指针。
//n:要比较的最大字节数。

返回值

memcmp 函数返回一个整数,表示比较结果:

  • 如果 str1 小于 str2,则返回值小于 0。
  • 如果 str1 等于 str2,则返回值等于 0。
  • 如果 str1 大于 str2,则返回值大于 0。

示例代码

以下是使用 memcmp 函数的一个简单示例:

#include <stdio.h>
#include <string.h> // 包含 memcmp 函数的头文件

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

    int result1 = memcmp(str1, str2, sizeof(str1)); // 比较 str1 和 str2
    int result2 = memcmp(str1, str3, sizeof(str1)); // 比较 str1 和 str3

    if (result1 < 0) {
        printf("'%s' is less than '%s'\n", str1, str2);
    } else if (result1 > 0) {
        printf("'%s' is greater than '%s'\n", str1, str2);
    } else {
        printf("'%s' is equal to '%s'\n", str1, str2);
    }

    if (result2 == 0) {
        printf("'%s' is equal to '%s'\n", str1, str3);
    }

    return 0;
}

注意事项

  1. 大小写敏感:memcmp 是大小写敏感的,所以 "Hello" 和 "hello" 会被认为是不相等的。

  2. 空终止符:memcmp 不会自动停止在空字符 \0,它会继续比较直到指定的字节数 n 或发现不同。

  3. 性能:memcmp 的时间复杂度是 O(n),其中 n 是要比较的字节数。

  4. 返回值:memcmp 的返回值可以用于条件语句和逻辑运算,因为它返回的是一个整数。

  5. 安全性:在使用 memcmp 比较字符串时,确保不要超过字符串的实际长度,以避免未定义行为。

memcmp 函数是处理内存比较任务的有用工具,但使用时需要注意其性能和返回值的处理。

以上是通过人为整理的,如果有纰漏,还请小伙伴们帮忙指出纠正,嘻嘻@

C语言常见概念 为了不再重复实现常见的代码,让程序员提升开发效率,C语言标准规定了一组函数,这些函数再由不同的编译器厂商根据标准进行实现,提供给程序员使用。这些函数组成了一个函数库,被称为标准库,这些函数就被称为库函数。(库函数:标准库中的函数) 阅读详情

相关推荐

Excel曲线拟合实战:从基础趋势线到高级回归分析

本文系统介绍了Excel曲线拟合的完整工作流,从基础的散点图与趋势线应用,到利用Solver插件进行自定义高级回归分析。文章详细讲解了线性、多项式、指数、对数等六大常用数学模型的适用场景与选择方法,并强调了通过R²值、残差图评估拟合效果、避免过拟合与外推风险的关键步骤,帮助读者掌握从数据探索到预测评估的实战技能。

weixin_29280219的博客 538

strlen的头文件(C语言)

strlen的头文件是如果忘记引用就会报错。

m0_72386103的博客 7801

如何在NVIDIA CX6 网卡和华为CE交换机上为RDMA协议使能DCQCN和PFC

【代码】如何在NVIDIA CX6 网卡和华为CE交换机上使能DCQCN和PFC。

Markchen7788的博客 5099

C语言strlen函数详解

strlen函数详细解析

2301_79180143的博客 1万+

【Telephony】APN配置及加载流程&项目实践(AOSP)

学习APN关键是学会明白apns-conf.xml文件各个参数的意思,然后熟悉TelephonyProvider是如何读取文件创建数据库的,譬如数据库表的约束、文件的读写顺序等,还有读取后的ApnSetting的二次定制以及显示(例如屏蔽xcap等)。虽然一般在项目中APN的需求很简单,就是按照客户提供的APN参数添加上配置,或者在显示屏蔽一些参数,但是项目维护的过程中APN的问题也是比较多的。

weixin_44513784的博客 5516

UBUNTU使用RTL8811CU网卡(包含树莓派)

下载驱动 从绿联中下载:链接 下载解压后,chmod Linux文件夹 sudo chmod -R 777 ./Linux/ 修改系统的BOOT Secure为disable,参考链接:链接 sudo apt install mokutil sudo mokutil --disable-validation 重启电脑后,按照提示选择change secure boot state,并输入对应的字母(并不是全部密码,而是第几个),选择disable即可 进入Linux文件夹,运行命令 ..

Hot_Ant的博客 6249

【C语言】strlen函数的讲解和模拟实现

arr4arr4与arr2不同的是我这次设置了arr4的大小,然后我用字符对arr4进行了初始化,虽然是用字符进行的部分初始化,但是编译器会帮我把没初始化的地方默认初始化为0,‘\0’的ASCII码值就是0,C语言字符在内存的形式就是ASCII码值,所以后面没初始化的地方存放的都是’\0’。进行初始化的,但是我没有设置arr的大小,所以编译器是不知道arr2的大小的,后面存放的是什么东西也是不知道的,但是strlen它是找’\0’的,并返回’\0’之前字符的个数。文章就写到这了,感谢你的观看!...

云泽野の编程日记 1万+

单目标跟踪算法及其复现过程---SiamFC(一)

在test.py文件中,就是利用训练出来的模型进行测试,需要更改预训练模型的路径,测试集的路径,以OTB100为例,最后输出的是对每一帧目标位置的坐标点。代码如下:首先需要下载got10k官方库,只需要在终端输入(注意:在终端安装各种库的时候不能使用网络代理),在环境已经配置到的情况下,只需要该其中的路径和就可以运行。这个系列博客仅为了记录各目标跟踪算法的复现(大多为跑通大佬们实现的代码),包括其中出现的很多问题和错误,学到的新知识等等。解决,而且只使用在线的方法,限制了他们可以学习的模型的丰富性。

weixin_58244117的博客 4763

c语言:字符串和内存函数介绍

c语言,字符串函数,内存函数,c

随便写点C++和JAVA的知识 1394

【RT-DETR有效改进】利用EMAttention加深网络深度提高模型特征提取能力(特征选择模块)

本文给大家带来的改进机制是EMAttention注意力机制,它的核心思想是,重塑部分通道到批次维度,并将通道维度分组为多个子特征,以保留每个通道的信息并减少计算开销。EMA模块通过编码全局信息来重新校准每个并行分支中的通道权重,并通过跨维度交互来捕获像素级别的关系。本文改进是基于ResNet18、ResNet34、ResNet50、ResNet101,文章中均以提供,本专栏的改进内容全网独一份深度改进RT-DETR非那种无效Neck部分改进,

Snu77的博客 3171

踩坑2周总结:Python+YOLO26搭建工业级多路视频分析应用,从单路卡顿到16路4K稳跑30FPS

本文分享了工业级多路视频分析系统的实战经验,针对智慧物流园区的车辆违停和人员安全监测需求,提出了一套完整的解决方案。作者通过踩坑实践,总结出多路视频分析的四大核心痛点:视频流解码瓶颈、推理调度混乱、内存占用爆炸和部署兼容性差。 文章详细介绍了技术选型方案,推荐使用FFmpeg+PyAV进行硬件加速解码、YOLO26+TensorRT INT8量化推理、单进程多线程的生产者-消费者架构,以及内存池复用等技术组合。该方案在RTX 4070 Ti上实现了16路4K视频30FPS稳定运行,GPU利用率达85%以上,

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 955

~C语言的主要特点~

~C语言的主要特点~

眼与泪的诀别的博客 1万+

NSX-T 4.1部署搭建

NSX-T4.1 部署搭建

weixin_58250887的博客 564

~C语言程序的结构~

~C语言程序的结构~

眼与泪的诀别的博客 1714

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

【C语言】C语言函数篇(带你轻松理解和使用函数~)

本章为个人所学所理解的C语言中函数篇的相关知识,定有不足,还望大家多多指教。函数是一段可以重复使用的代码,用来独立地完成某个功能。自定义函数是自己实现的为了完成整个程序某个功能所设置的,他能多次调用,服务于整个程序,并且自定义函数各模块之间尽量功能独立。大家想想,如果所有的功能库函数都为你提供了,那还关程序员啥事?自定义函数在某种程度上更高于库函数,他能体现一个程序员的水平如何。

Welcome home | Jian Liao 's blog 2576

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

C语言(12)——进阶函数

《C语言函数指南:从库函数到自定义函数》摘要: 本文系统介绍了C语言函数的核心概念与应用。主要内容包括:1)函数本质是完成特定功能的代码块,可实现代码复用和任务分解;2)库函数是ANSI标准规定的常用函数,需掌握其返回值、参数和功能;3)自定义函数需理解声明与定义的区别,以及形参(占位变量)与实参(具体值)的关系;4) 函数使用技巧包括return语句的返回/终止作用、static函数的文件内私有化、extern函数的跨文件调用。通过代码示例详细演示了各类函数的定义和使用方法,帮助开发者提升代码组织和复用能

ankleless的博客 1901

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

c语言关于函数那一章的知识点,C语言程序设计知识点—第7章 函数精选.pdf

C语言程序设计知识点—第7章 函数精选C 语言程序设计知识点 主讲教师:杨剑第7 章:函数1. 本章目标 熟练掌握函数的定义与调用方法 理解函数的定义、声明和调用的区别 理解函数原型、实参、形参和函数的返回值 了解函数的嵌套调用和递归调用的方法 掌握数组做为函数参数的使用方法 理解变量的作用域和存储方法2. 函数机制的优点 函数可以把相对...

weixin_39951181的博客 148

初识C语言

初始C语言

qq_62642395的博客 108

【C语言小游戏】带你用C语言轻松实现三子棋~

本章我们用C语言来实现一个初级的三子棋小游戏,三子棋想必大家都玩过,只要每一行或每一列或对角线三个棋相同,那么便获得胜利,由此我们分析下棋的步骤与获胜判断,来构建一个C语言三子棋的代码框架。

Welcome home | Jian Liao 's blog 1306

c语言程序设计主函数是什么,C语言程序设计知识点—第7讲 函数.pdf

C 语言程序设计知识点 主讲教师:杨剑第7 章:函数1. 本章目标 熟练掌握函数的定义与调用方法 理解函数的定义、声明和调用的区别 理解函数原型、实参、形参和函数的返回值 了解函数的嵌套调用和递归调用的方法 掌握数组做为函数参数的使用方法 理解变量的作用域和存储方法2. 函数机制的优点 函数可以把相对独立的某个功能抽象出来,使之成为程序中...

weixin_42656416的博客 580

【C语言】C语言常见字符串函数解析 ⭐ 个别函数不光要会使用,还要能自己实现一个噢~

常见的字符串函数在一定程度上可以让我们在写代码,或者是在刷某些有关字符串的题目时事半功倍,并且常见字符串函数的功能非常常用,因此我们应该熟练使用这些字符串函数,以及部分函数要能自我实现。string常用字符串函数的熟练使用可以在某些地方大大提升写代码效率,因此一定要好好掌握,最好能够自我实现,吃透这些函数的运行逻辑,以便更精确更融洽的使用。

Welcome home | Jian Liao 's blog 499

C++和C在linux下编程和与在WINDOWS下有什么区别

C++和C在linux下编程和与在WINDOWS下有什么区别 [ 标签:c++ 编程,c++,linux ] 说下C的函数库 有什么区别就行了。 C++是不是没区别? 函数库的区别linux下的C函数库和windows下的函数库系统调用的机制不一样Glibc包含了主要的C库。 这个库提供了基本例程,用于分配内存、搜索目录、打开关闭文件、读写文件、字串处理、模式匹配 、

jinyeweiyang的专栏 3927

聊聊我理解的ANSI C、ISO C、GNU C、POSIX C

几句话了解C标准之间的关系 C语言标准 早期的计算机汇编语言是与机器平台紧密耦合的,为了屏蔽这种耦合,增加代码的可移植性,C语言随机出现。 二十世纪八十年代,为了避免各开发厂商用的C语言语法产生差异,由美国国家标准局为C语言制定了一套完整的国际标准语法,称为ANSI C,作为C语言最初的标准。 与ANSI C标准同时出现的就是ISO组织,将ANSI C加入了ISO的大家庭,定义了ISO C...

liming0931的专栏 431

C++语法

C++语法第1讲:变量、输入输出、表达式与顺序语句 第1讲:变量、输入输出、表达式与顺序语句 常用头文件 iostream 里面包括cin 、cout、scanf、printf cstdio 包括 scanf、printf cmath 多用于数学 C++万能头文件 bits/stdc++.h 数据类型 bool int 2B long 4B long long 8B float 6~7位小数,4B double 15~16位小数,8B long double 15~16位小数,8B 字符的读入

学习积累 1905

C++入门之命名空间

我们知道,编写代码时会用到许多变量,函数和类的名称,这些名称存在于全局作用域中,可能会与库函数中的一些名称冲突,命名空间的存在就是为了解决这一问题的。namespace本质上是定义出一个域,这个域与全局域各自独立,不同的域可以定义同名变量,所以rand就不会与其他名称冲突了。~命名空间域影响的是编译时语法查找一个变量/函数/类型出处的逻辑,不会影响它们的生命周期,在命名空间域中的变量依旧时全局变量。在上述代码中,lhy命名空间中又嵌套了一个lh的命名空间,可以有同名的变量,不会冲突。

2301_80934055的博客 313

【落羽的落羽 C语言篇】指针·其之五

今天,我们也应该学会模拟实现qsort函数。定义一个函数。

记录我一步步的学习历程,期待无限进步,向星举目! 1528
上一篇: 深度剖析数据在内存中的存储~
下一篇: 模拟实现C库函数~
知困勉行的Allen
博客等级 码龄3年 279粉丝 33原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值