C语言字符串处理
1. memcpy 复制
1.1 函数介绍
描述:
C 库函数 void *memcpy(void *str1, const void *str2, size_t n) 从存储区 str2 复制 n 个字节到存储区 str1。
参数:
- str1 – 指向用于存储复制内容的目标数组,类型强制转换为 void* 指针。
- str2 – 指向要复制的数据源,类型强制转换为 void* 指针。
- n – 要被复制的字节数。
1.2用法示例
1.2.1 把数组B赋值给数组A
/*
* - 功能:转置3*3的矩阵
* - 参数:int array[3][3]
* - 返回值:成功1、失败0
* - 作者:SU
*/
Status convert(int array[3][3])
{
int temp[3][3];
for (char i = 0; i < 3; i++)
{
for (char j = 0; j < 3; j++)
{
temp[j][i] = array[i][j];
}
}
//因为array和temp的空间是相同的所以用memcpy函数直接对它进行array=temp
memcpy(array, temp, sizeof(int) * 3 * 3);
return SUCCESS;//SUCCESS=1
}
所以可以看到memcpy可以把相同空间大小的两个东西进行复制
1.2.2 数据结构——泛型输出
2. strcmp 比较
2.1 函数介绍
描述:
C 库函数 int strcmp(const char *str1, const char *str2) 把 str1 所指向的字符串和 str2 所指向的字符串进行比较。
参数:
- str1 – 要进行比较的第一个字符串。
- str2 – 要进行比较的第二个字符串。
返回值:
- 如果返回值小于 0,则表示 str1 小于 str2。
- 如果返回值大于 0,则表示 str1 大于 str2。
- 如果返回值等于 0,则表示 str1 等于 str2。
注意:
- 比较规则:两个字符串自左向右逐个字符相比(按 ASCII 值大小相比较),直到出现不同的字符或遇 \0 为止。
如:1."A"<"B" 2."A"<"AB" 3."Apple"<"Banana" 4."A"<"a" 5."compare"<"computer"
- 特别注意:strcmp(const char *s1,const char * s2) 这里面只能比较字符串,即可用于比较两个字符串常量,或比较数组和字符串常量,不能比较数字等其他形式的参数。
2.2 用法示例
2.2.1 用户身份核验
if(strcmp(userpass,temp)==0)
2.2.2 对字符串进行排序
/*
* - 功能:对输入的字符串进行排序
* - 参数:char **str,int n
* - 返回值:成功返回1、失败返回0
* - 作者:SU
*/
Status SortStr(char **str,int n)
{
char* temp = NULL;
for (int i = 0; i < n; i++)
{
for (int j = i+1; j < 10; j++)
{
if (strcmp(str[i],str[j])>0)
{
temp = str[i];
str[i] = str[j];
str[j] = temp;
}
}
}
return SUCCESS;
}
(2021/11/6编辑)
3. memset 单字符填充字符串
3.1 函数介绍
概述:
C 库函数 void *memset(void *str, int c, size_t n) 复制字符 c(一个无符号字符)到参数 str 所指向的字符串的前 n 个字符。
用c把str填充完整
包含在<string.h>
参数:
- str – 指向要填充的内存块。
- c – 要被设置的值。该值以 int 形式传递,但是函数在填充内存块时是使用该值的无符号字符形式。
- n – 要被设置为该值的字符数。
3.2 用法示例
3.2.1 清零字符串
char str[50];
memset(str,0,sizeof(str));
4. sprintf 格式化变量到字符串
4.1 函数介绍
概述:
int sprintf(char *str, const char *format, …) 发送格式化输出到 str 所指向的字符串。
包含在<stdio.h>中
参数:
- str – 这是指向一个字符数组的指针,该数组存储了 C 字符串。
- format – 这是字符串,包含了要被写入到字符串 str 的文本。它可以包含嵌入的 format 标签,format 标签可被随后的附加参数中指定的值替换,并按需求进行格式化。
4.2 用法示例
4.2.1 在RC522门禁中获取卡号
void NFC()
{
uint8_t RxBuffer[4];
char Card_ID[8];
PCD_Request(PICC_REQALL, RxBuffer);//返回值为0,代表寻卡成功;并把卡类型存入RxBuffer中
PCD_Anticoll(RxBuffer); //防冲撞,完成这部就可以简单地 读取卡号
sprintf(Card_ID,"%x%x%x%x",RxBuffer[0],RxBuffer[1],RxBuffer[2],RxBuffer[3]);
if(strcmp(Card_ID,"xxxxxxx")==0)//xxx为允许进入的卡号
{
;//开门
memset(RxBuffer, 0, sizeof(RxBuffer));//清空字符串,这里要清除RxBuffer才行
}
}