单片机开发中常用到的C语言中关于数组和字符串的函数

常用到的关于操作空间(数组,堆空间)时的函数

> memset()函数

所在位置:string.h

函数声明:

 void *memset(void *str, int c, size_t n)

str – 指向要填充的内存块。
c – 要填进去的值。(该值以 int 形式传递,但是函数在填充内存块时是使用该值的无符号字符形式)
n – 要被设置为该值的字符数(要填入几个空间)。

作用:

对数组或堆空间初始化或者重初始化
eg:

  • 在定义了一个数组或堆空间时,要使数组的每个空间或是堆的每个空间都变成你想要的值时

int arry[100];
memset(arry,1,100)

如此即可使数组100个空间的值都变成:1

  • 当数组或堆在存放了一组数据时,想要把这个数组重新初始化时
int arry[10] = {1,2,3,4,5,6,7,8,9,0}; //数组现在存放的数据
memset(arry,0,10);

如此即可使得数组所有空间重新初始化

> memcpy()函数

所在位置:string.h

函数声明:

void *memcpy(void *str1, const void *str2, size_t n)

str1 – 指向用于存储复制内容的目标数组,类型强制转换为 void* 指针。
str2 – 指向要复制的数据源,类型强制转换为 void* 指针。
n – 要被复制的字节数。

作用:

将数据从一个空间拷贝到另一个空间
eg:

  • 将数组arry从二之后的所有值复制到堆空间arry1第五个空间之后的地方
/* 将数组arry从二之后的所有值复制到堆空间arry1中*/
int arry[10] = {1,2,3,4,5,6,7,8,9,0}; //数组现在存放的数据
int *arry1 =  (int *)malloc(13*sizeof(int));//创建个堆空间
memcpy(arry1[5], arry[2], 8);

如此即可使数组数组arry的值复制到arry1中

> memcmp()函数

所在位置:string.h

函数声明:

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

其中s1和s2分别指向要比较的两块内存,n为要比较的字节数。返回值为0表示相等,大于0表示s1大于s2,小于0表示s1小于s2。

作用:

比较两个字符串或者两个数组是否相等
eg:

  • 比较字符串Hello和Hello!
char str1[] = "Hello";
char str2[] = "Hello world";//创建两个字符串
int result = memcmp(str1, str2, 5);//创建个堆空间
if (result == 0) {
    printf("str1 and str2 are equal\n");
} else {
    printf("str1 and str2 are not equal\n");
}
运行结果:
str1 and str2 are equal

如此即可使数组数组arry的值复制到arry1中

常用到的关于字符串的函数

> strcat()和strncat()函数

所在位置:string.h

函数声明:

char *strcat(char * __restrict /*s1*/, const char * __restrict /*s2*/)

char *strncat(char * __restrict /*s1*/, const char * __restrict /*s2*/, size_t /*n*/) __attribute__((__nonnull__(1,2)));

作用:

strcat:将S2的内容添加到S1所指字符串的末尾,会改变S1的内容不会改变S2 的内容
strncat:多了一个设置添加字节数的机制(如:strncat(S1,S2,5)为将S2前5个字节添加到S1中)

> strlen()函数

所在位置:string.h

函数声明:

strlen(const char * /*s*/) __attribute__((__nonnull__(1)));

作用:

得出字符串的长度(不含结束符(空字符)的长度)

> strcmp()和strncmp()函数

所在位置:string.h

函数声明:

int strcmp(const char * /*s1*/, const char * /*s2*/) __attribute__((__nonnull__(1,2)));
int strncmp(const char * /*s1*/, const char * /*s2*/, size_t /*n*/) __attribute__((__nonnull__(1,2)));

作用:

比较机制为:对两个字符串中的字符的ASCII值进行一个个的比较(对单个字符值的比较可以看成一个减法式子:前-后,若前>后则结果为正,前<后结果为负,前=后结果为零),最后得出总的值。
eg:
strcpmp(“A”,“A”);
得出值为零
strcpmp(“A”,“B”);
得出值为负
strcpmp(“B”,“A”);
得出值为正

strncmp:指定只对字符串前几个字符进行比较
eg:
若只比较前2个则为:
strncmp(“ABC”,“ABCD”,2)
因为"AB"="AB"所以结果为:0

若比较前4个则为:
strncmp(“ABC”,“ABCD”,4)
因为"ABCD"比"ABC"多一个D所以结果为:-68(D的ASCII表对应十进制的数为68)

> strcpy()和strncpy()函数

所在位置:string.h

函数声明:

char *strcpy(char * __restrict /*s1*/, const char * __restrict /*s2*/) __attribute__((__nonnull__(1,2)));
char *strncpy(char * __restrict /*s1*/, const char * __restrict /*s2*/, size_t /*n*/) __attribute__((__nonnull__(1,2)));

作用:

与strcat有点相似都是把S2的内容附到S1上,不过strcpy是把S2的内容附到S1指针当前所指的位置(可能会出现对S1当前所指字符串内容的覆盖),而strcat是把S2的内容附到S1所指字符串的串尾。
strncpy为指定S2长度的字符串内容附到S1指针当前所指的位置上。

> strstr()函数

所在位置:string.h

函数声明:

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

haystack – 要被检索的 C 字符串。
needle – 在 haystack 字符串内要搜索的小字符串。

作用:

在字符串 haystack 中查找第一次出现字符串 needle 的首地址,不包含终止符 ‘\0’

返回值:

该函数返回值为在 haystack(被查找字符串) 中第一次出现 needle 字符串(目标字符串)的首地址,如果未找到则返回 NULL。

eg:

  • (在与云服务器通讯时,会接收到来自云服务器的数据,这些数据均为一些字符串)解读云服务器是否发来打开LED_1的指令,若是则打开LED1否则关闭LED1
//MQTT_CMDOutPtr 为数据接收缓冲区
ifstrstr((char *)MQTT_CMDOutPtr+2,"\"params\":{\"Switch1\":1}")//当strstr函数有返回值时说明在被查找字符串中出现目标字符串
LED_1 ON;
else 
LED_1 OFF;

> strchr()函数和strrchr()函数

所在位置:string.h

函数声明:

char *strchr(const char *str, int c)
char *strrchr(const char *str, int c)

str-- 要被检索的 C 字符串。
c-- 在 str字符串内要搜索的字符。

作用:

strchr()函数作用:在给定字符串中查找第一个出现的指定字符。该函数返回字符在父串中的首地址,如果未找到,则返回NULL。
strrchr()函数作用:函数在给定字符串中查找最后一个出现的指定字符。该函数返回字符在父串中的首地址,如果未找到,则返回NULL。

返回值:

strchr()函数返回值为在 str(被查找字符串) 中第一次出现 c字符(目标字符)的首地址,如果未找到则返回 NULL。
strchr()函数返回值为在 str(被查找字符串) 中最后一次出现 c字符(目标字符)的首地址,如果未找到则返回 NULL。

> sprintf()函数

所在位置:stdio.h

函数声明:

int sprintf(char *str, const char *format, ...)

str – 字符串所存放的地方。
format–所要字符串
…–所使用的的变量

作用:(在单片机里常用来编辑发送AT指令)

将printf会输出的字符串,存到一个空间里(数组/堆空间)
如printf(“Hello World”);
在单片机上会通过串口发送Hello World的字符串
而在电脑上,则会在调试的时候直接输出Hello World的字符串
而sprintf(tem,“Hello World”);则相当于把Hello World字符串储存到tem变量里
eg:

  • 向ESP8266发送连接WIFI的AT指令时,将WIFI用户名与WIFI密码与AT指令衔接起来,存到数组中
char cCmd [120];
sprintf ( cCmd, "AT+CWJAP=\"%s\",\"%s\"", pSSID, pPassWord );

你可能感兴趣的:(C语言,STM32,keil,c语言,单片机,stm32)