【单片机 &C语言】单片机学习过程中常见C库函数(学习笔记)

 memset()

 ​C 标准库 - <string.h>

string .h 头文件定义了一个变量类型、一个宏和各种操作字符数组的函数。

<string.h> 是 C 标准库中的一个头文件,提供了一组用于处理字符串和内存块的函数。这些函数涵盖了字符串复制、连接、比较、搜索和内存操作等。

 描述

void *memset(void *str, int c, size_t n)
参数说明
*str指向要填充的内存区域的指针,使用时需要确保 ptr 指向的内存区域足够大,避免发生越界访问
c 要设置的值,通常是一个无符号字符,通常是一个 int 类型的值,但实际上只使用了该值的低8位。这意味着在范围 0 到 255 之外的其他值可能会产生未定义的行为
n要被设置为该值的字节数,通常是通过 sizeof() 或其他手段计算得到的

 sizeof()  

sizeof() 函数是一个运算符而不是函数,用于计算一个类型或变量所占用的内存字节数。可以用它来获取任何类型的数据的字节数,包括基本数据类型、数组、结构体、共用体等等。

语法形式

sizeof 运算符有两种使用形式:

  • 计算数据类型的大小:sizeof(数据类型)
  • 计算变量的大小:sizeof(变量名) 或者 sizeof 变量名 
sizeof(int)  // 输出 4,即整型变量占用 4 个字节
int x;
sizeof(x)  // 输出 4,即整型变量 x 占用 4 个字节

char s[] = "Hello, world!";
sizeof(s)  // 输出 14,即字符串 s 中有 14 个字符(包括结尾的空字符 '\0')

memset() 函数将指定的值 c 复制到 str 所指向的内存区域的前 n 个字节中,这可以用于将内存块清零'\0' 或设置为特定值。

实例1 

#include <stdio.h>
#include <string.h>

int main() 
{
    char buffer[100];
    // 将buffer数组的所有元素初始化为 '\0'
    memset(buffer, '\0', sizeof(buffer));
    return 0;
}

实例2

#include <stdio.h>    //包含标准输入输出库的头文件,以便使用puts函数进行输出操作
#include <string.h>    //包含字符串处理函数的头文件,这里使用的strcpy和memset函数都声明在这个头文件中

int main ()
{
   // 定义一个大小为50的字符数组
   char str[50];

   // 使用strcpy函数将字符串复制到str数组中
   strcpy(str,"This is string.h library function");
   // 使用puts函数输出字符串
   puts(str);

   // 使用memset函数将str数组的前7个字符设置为'$'
   memset(str,'$',7);
   // 再次使用puts函数输出修改后的字符串
   puts(str);

   return(0);
}

 打印结果

This is string.h library function
$$$$$$$ string.h library function

在一些情况下,需要快速初始化大块内存为零或者特定值,memset() 可以提供高效的实现。在清空内存区域或者为内存区域赋值时,memset() 是一个常用的工具函数。

#include <stdio.h>
#include <string.h> 

int main() 
{
    char buffer[10];

    // 将 buffer 数组的前5个字节设置为字符 'A',并添加字符串终止符
    memset(buffer, 'A', 5);
    buffer[5] = '\0'; // 确保添加字符串终止符
    printf("Buffer after memset: %s\n", buffer);

    // 将 buffer 数组清零,使用 '\0' 替代 0
    memset(buffer, '\0', sizeof(buffer)); // 使用'\0'确保一致性及可读性

    printf("Buffer after memset: %s\n", buffer);

    return 0;
}

打印结果

Buffer after memset: AAAAA
Buffer after memset: 

注意事项

  • 字符串结束标志:使用%s输出字符串时,函数会从指定的字符串起始地址开始输出字符,直到遇到字符串结束标志'\0'才会停止。所以,确保字符串以'\0'结尾是很重要的,不然可能会输出多余的字符。
  • 参数匹配:在使用%s时,对应的参数必须是一个指向以'\0'结尾的字符数组(也就是字符串)的指针。如果参数类型不匹配,可能会导致未定义行为。

 strlen()

   ​C 标准库 - <string.h>

描述

C 库函数 size_t strlen(const char *str) 计算字符串 str 的长度,直到空结束字符,但不包括空结束字符。 

size_t 是 C 和 C++ 编程语言里的一种数据类型,主要用于表示对象的大小或者数组的长度。

const 是一个类型修饰符,其主要作用是把变量或者对象声明为常量,以此来保证它们的值在程序运行期间不会被修改。

size_t strlen(const char *str)
参数说明
*str要计算长度的字符串

 返回值:该函数返回字符串的长度。

 实例

#include <stdio.h>
#include <string.h>

int main ()
{
    // 定义一个大小为 50 的字符数组 str,用于存储字符串
    char str[50];
    // 定义一个整型变量 len,用于存储字符串的长度
    int len;

    // 使用 strcpy 函数将字符串 "This is runoob.com" 复制到字符数组 str 中
    // strcpy 函数的原型是 char *strcpy(char *dest, const char *src);
    // 它会把 src 指向的字符串复制到 dest 指向的数组中,并且会复制字符串结束标志 '\0'
    strcpy(str, "This is runoob.com");

    // 使用 strlen 函数计算字符数组 str 中字符串的长度
    // strlen 函数的原型是 size_t strlen(const char *s);
    // 它会从 s 指向的字符开始,逐个字符计数,直到遇到字符串结束标志 '\0' 为止
    // 注意,strlen 计算的长度不包括字符串结束标志 '\0'
    len = strlen(str);

    // 使用 printf 函数输出字符串及其长度
    // %s 是格式说明符,用于输出字符串
    // %d 是格式说明符,用于输出十进制整数
    printf("|%s| 的长度是 |%d|\n", str, len);

    // main 函数返回 0,表示程序正常结束
    return(0);
}

打印结果

|This is runoob.com| 的长度是 |18|

 sizeof() 和 strlen()区别:C 语言关于sizeof() 和 strlen()区别 | 菜鸟教程

strstr()

 C 标准库 - <string.h>

描述 

 C 库函数 char *strstr(const char *haystack, const char *needle) 在字符串 haystack 中查找第一次出现字符串 needle 的位置,不包含终止符 \0。

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

参数说明
*haystack要被搜索的主字符串,即较大的字符串,通常是一个以 '\0' 结尾的字符数组。该参数被声明为 const char *,表示函数不会修改这个字符串的内容
*needle要查找的子字符串,同样是一个以 '\0' 结尾的字符数组

strstr() 函数用于在字符串 haystack 中查找子字符串 needle 的第一次出现位置。如果找到,则返回指向该位置的指针;如果未找到,则返回 NULL。

返回值

  • 如果在 haystack 中找到了 needle 子字符串,函数返回一个指向 needle 在 haystack 中首次出现位置的指针。
  • 如果 needle 是空字符串,则返回 haystack 本身。
  • 如果在 haystack 中没有找到 needle 子字符串,则返回 NULL

 实例

#include <stdio.h>
#include <string.h>

int main() {
    // 定义一个指向常量字符的指针 haystack,
    // 并初始化为一个包含多个字符的字符串,作为被搜索的主字符串
    const char *haystack = "Hello, World! This is a test.";
    // 定义一个指向常量字符的指针 needle,
    // 并初始化为一个较短的字符串,作为要在主字符串中查找的子字符串
    const char *needle = "World";
    // 调用 strstr 函数,该函数用于在 haystack 中查找 needle 首次出现的位置
    // 若找到,返回指向该位置的指针;若未找到,返回 NULL
    // 将函数返回结果存储在指针变量 result 中
    char *result = strstr(haystack, needle);

    // 判断 result 是否不为 NULL,即是否找到了子字符串
    if (result != NULL) {
        // 如果找到了子字符串,使用 printf 函数输出信息
        // 输出子字符串及其在主字符串中首次出现位置开始的后续内容
        printf("子字符串 '%s' 在主字符串中首次出现的位置是: %s\n", needle, result);
    } else {
        // 如果未找到子字符串,使用 printf 函数输出提示信息
        printf("未找到子字符串 '%s'\n", needle);
    }

    // main 函数返回 0,表示程序正常结束
    return 0;
}

打印结果

子字符串 'World' 在主字符串中首次出现的位置是: World! This is a test.

 strcat()

 C 标准库 - <string.h>

描述 

strcat() 是 C 语言标准库 <string.h> 中的一个函数,其作用是将一个字符串追加到另一个字符串的末尾

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

C 库函数 char *strcat(char *dest, const char *src) 把 src 所指向的字符串追加到 dest 所指向的字符串的结尾。  

参数说明
*dest目标字符串,也就是要被追加内容的字符串。它必须是一个足够大的字符数组,以容纳原字符串和要追加的字符串以及字符串结束符 '\0'
*src源字符串,即要追加到目标字符串末尾的字符串,该字符串不会覆盖目标字符串

 返回值:函数返回一个指向目标字符串 dest 的指针,方便进行链式调用。

实例 

#include <stdio.h>
#include <string.h>

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

    // 调用 strcat 函数将 src 追加到 dest 的末尾
    strcat(dest, src);

    printf("拼接后的字符串是: %s\n", dest);

    return 0;
}

工作原理

strcat() 函数会先找到目标字符串 dest 的末尾(即 '\0' 字符的位置),然后将源字符串 src 的内容复制到该位置,包括 src 的字符串结束符 '\0'

注意事项

  • 目标数组大小:使用 strcat() 时,必须确保目标数组 dest 有足够的空间来容纳源字符串 src。如果 dest 数组空间不足,会导致缓冲区溢出,这是一个严重的安全问题。
  • 字符串结束符:目标字符串 dest 必须以 '\0' 结尾,否则 strcat() 函数可能无法正确找到字符串的末尾,从而导致未定义行为。

 strcpy()

 C 标准库 - <string.h>

 描述

strcpy() 是 C 语言标准库 <string.h> 中的一个函数,用于将一个字符串复制到另一个字符数组中

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

 作用:把 src 所指向的字符串复制到 dest。  

参数说明
*dest指向用于存储复制内容的目标数组,也就是要将字符串复制到的地方。它必须有足够的空间来容纳源字符串(包含字符串结束符 '\0'
*src要复制的字符串,是一个以 '\0' 结尾的字符序列,函数会将其内容复制到目标数组中

返回值:函数返回一个指向目标字符数组 dest的指针,这样设计方便进行链式调用。

实例 

#include <stdio.h>
#include <string.h>

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

    // 调用 strcpy 函数将 src 复制到 dest
    strcpy(dest, src);

    printf("复制后的字符串是: %s\n", dest);

    return 0;
}

工作原理

strcpy() 函数会从源字符串 src 的起始位置开始,逐个字符地将字符复制到目标数组 dest 中,直到遇到源字符串的结束符 '\0'。复制完成后,结束符 '\0' 也会被复制到目标数组中,以此确保目标数组存储的是一个合法的字符串。

注意事项

  • 目标数组大小:使用 strcpy() 时,要保证目标数组 dest 有足够的空间来存储源字符串及其结束符。如果 dest 数组空间不足,会引发缓冲区溢出问题,这是一种严重的安全隐患。
  • 覆盖原有内容strcpy() 会覆盖目标数组 dest 中原有的内容。如果 dest 之前已经存储了数据,复制操作会将其覆盖。

puts()

 C 标准库 - <stdio.h>

puts() 是 C 语言标准库 <stdio.h> 中的一个函数,主要用于将字符串输出到标准输出设备(通常是控制台),并在输出结束后自动添加一个换行符 

int puts(const char *s); 

s:指向要输出的字符串的指针,该字符串必须以空字符 '\0' 结尾 。

返回值

  • 如果输出成功,puts() 函数返回一个非负整数(通常是一个表示成功输出的正数)。
  • 如果输出过程中发生错误,函数返回 EOF(通常定义为 -1),EOF 是 <stdio.h> 中定义的一个宏,用于表示文件结束或输入输出错误。

 实例

#include <stdio.h>

int main() 
{
    const char *message = "Hello, World!";
    int result = puts(message);

    if (result == EOF) {
        printf("输出过程中发生错误。\n");
    } else {
        printf("字符串输出成功。\n");
    }

    return 0;
}

工作原理

puts() 函数会从指针 s 所指向的位置开始,逐个字符地输出字符串,直到遇到字符串结束符 '\0' 为止。在输出完字符串后,它会自动在末尾添加一个换行符 '\n',这意味着每次调用 puts() 后,下一次的输出会从新的一行开始。

与 printf() 的比较

  • 功能差异puts() 主要用于输出字符串并自动添加换行符,功能相对单一;而 printf() 是一个格式化输出函数,可以根据格式说明符输出不同类型的数据,功能更加灵活和强大。
  • 使用场景:如果只需要输出一个字符串并换行,使用 puts() 会更简洁;如果需要对输出进行格式化,例如输出不同类型的数据、控制输出的宽度和精度等,则应该使用 printf()

atoi()

C 标准库 - <stdlib.h>

描述 

int atoi(const char *nptr); 

作用:把参数 nptr 所指向的字符串转换为一个整数(类型为 int 型)。  

  • nptr:这是一个指向要转换的字符串的指针。该字符串可以包含可选的前导空白字符(如空格、制表符等),接着可以是一个可选的正负号(+ 或 -),然后是一系列的数字字符。函数会尝试将这样的字符串转换为对应的整数值。

返回值

  • 若字符串能够成功转换为整数,atoi() 函数会返回转换后的整数值。
  • 若字符串不能被正确转换,比如字符串中不包含有效的数字字符,函数会返回 0。

 实例1

#include <stdio.h>
#include <stdlib.h>

int main() {
    const char *str1 = "12345";
    const char *str2 = "  -678";
    const char *str3 = "abc123";

    int num1 = atoi(str1);
    int num2 = atoi(str2);
    int num3 = atoi(str3);

    printf("字符串 '%s' 转换后的整数是: %d\n", str1, num1);
    printf("字符串 '%s' 转换后的整数是: %d\n", str2, num2);
    printf("字符串 '%s' 转换后的整数是: %d\n", str3, num3);

    return 0;
}

打印结果

字符串 '12345' 转换后的整数是: 12345
字符串 '  -678' 转换后的整数是: -678
字符串 'abc123' 转换后的整数是: 0

注意事项

  • 溢出问题atoi() 函数不会对转换结果进行溢出检查。如果字符串表示的数值超出了 int 类型的取值范围,会产生未定义行为。
  • 错误处理atoi() 函数在遇到无法转换的字符串时只会返回 0,无法明确区分是字符串表示的数值为 0 还是转换失败。

 printf()函数

C 标准库 - <stdio.h>

C 库函数 – printf() | 菜鸟教程

 printf()规定符

  • %d 十进制有符号整数
  • %u 十进制无符号整数
  • %f 浮点数
  • %s 字符串
  • %c 单个字符
  • %p 指针的值
  • %e 指数形式的浮点数
  • %x, %X 无符号以十六进制表示的整数
  • %o 无符号以八进制表示的整数
  • %g 把输出的值按照 %e 或者 %f 类型中输出长度较小的方式输出
  • %p 输出地址符
  • %lu 32位无符号整数
  • %llu 64位无符号整数
  • %% 输出百分号字符本身。

上述部分笔记来自C库函数-菜鸟教程

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值