C 语言 _ 数组的查找、替换、排序、拼接
作者:DS小龙哥
- 2022 年 5 月 09 日
本文字数:4848 字
阅读完需:约 16 分钟
这篇文章主要是总结 C 语言的位运算几个实战例子,接着介绍数组的基本定义用法、数组排序、插入、拼接、删除、字符串查找替换等。
1. 颜色转换的例子
1.颜色转换的例子: RGB888 RGB565 RGB666….
int data=12345; //RGB888的颜色
要求将data转为RGB565 -去掉高位
示例:
/*
int data=101010101010101010101010 11184810
R:01010
G:101010
B:01010
0101010101001010 21834
10101010
00111111
*/
#include <stdio.h>
int main(int argc, char * argv[])
{
unsigned short rgb565_c;
unsigned int data=11184810; //RGB888
unsigned char r=(data>>16)&0xFF;
unsigned char g=(data>>8)&0xFF;
unsigned char b=(data>>0)&0xFF;
printf("RGB88_r=0x%X\n",r);
printf("RGB88_g=0x%X\n",g);
printf("RGB88_b=0x%X\n",b);
r&=0x1F; //5
g&=0x3F; //6
b&=0x1F; //5
rgb565_c=(r<<11)|(g<<5)|(b<<0);
printf("rgb565_c=%d\n",rgb565_c);
return 0;
}
复制代码
2. 位运算综合练习
2.位运算综合练习
#include <stdio.h>
int main(int argc,char **argv)
{
/*1. 存放数据*/
data|='A'<<24;
data|='B'<<16; //F
data|='C'<<8;
data|='D'<<0;
/*2. 修改数据*/
data&=~(0xFF<<8*2); //清除指定位
data|='F'<<16;
/*3. 取出数据*/
printf("%c\n",(data>>24)&0xFF);
printf("%c\n",(data>>16)&0xFF);
printf("%c\n",(data>>8)&0xFF);
printf("%c\n",(data>>0)&0xFF);
return 0;
}
复制代码
3. 位运算实际的运用
3.实际的运用
short c1=1234; //R占11~15位 G占2~7位
short c2=4567; //B占 11~15位
RGB565;
要求: 将以上RGB分量提取出来,存在另一个变量(16位的变量)中—RGB565 。
unsigned int data_1; //整型 4个字节
unsigned short data_2; //短整型 2个字节
unsigned long data_3; //长整型 4个字节
unsigned long long data_3; //双长整型 8个字节
示例:
/*
short c1=1234; //R占11~15位 G占2~7位
short c2=4567; //B占 11~15位
c1=101010101010101010101010 11184810
c2=101010101010101010101010 11184810
r: 10101
g: 101010
b: 10101
rgb565=1010110101010101 44373
*/
#include <stdio.h>
int main(int argc, char * argv[])
{
unsigned int c1=11184810;
unsigned int c2=11184810;
unsigned char r,g,b;
unsigned short c3;
/*1. 转换为RGB888*/
r=c1>>8;
g=c1&0xFF;
b=c2>>8;
/*2. 转换为RGB565*/
r=r>>3;
g=g>>2;
b=b>>3;
/*3. 组合颜色*/
c3=(r<<11)|(g<<5)|(b<<0);
printf("c3=%d\n",c3);
return 0;
}
复制代码
4. 数组特点介绍
内存空间: 都是连续的---线性空间。
数组类型定义: <数据类型> 数组的名称[数组的大小];
int buff[100];
数组的特性:
(1)数组的空间是连续的。 就是同类型变量的集合
(2)数组里只能存放相同类型的数据
(3)数组的下标是从0开始
(4)数组在定义的时候,必须得有一个合法空间。 int buff[];
#include <stdio.h>
int main(int argc, char * argv[])
{
int buff_int[100]; //空间是多大? 400字节
//下标范围: 0~99
char buff_char[100]; //空间是多大?100字节
//下标范围:0~99
return 0;
}
数组示例:
#include <stdio.h>
int main(int argc, char * argv[])
{
int buff1[]={1,2,3,4,5,6,7,8,9,0}; //大小以数据数量为准
int buff2[1]; //空间定义必须大于0
printf("%d\n",buff1[0]); //1
printf("%d\n",buff1[2]); //3
printf("%d\n",buff1[4]); //5
return 0;
}
数组的数据倒序输出:
#include <stdio.h>
int main(int argc, char * argv[])
{
int buff1[]={1,2,3,4,5,6,7,8,9,0}; //大小以数据数量为准
int i;
for(i=0;i<10;i++)
{
printf("%d ",buff1[9-i]);
}
return 0;
}
//数组的初始化
/*
1. 数组什么时候可以整体赋值?只有在数组定义的时候
2. 数组的空间必须是常量 (C89)
错误:
int data=100;
int buff[data];
3. 数组的下标是从0开始
*/
数组定义:
(1)一维数组 char data[100];
(2)二维数组 char data[100][100];
(3)三维数组 char data[100][100][100]; ………….
题目:
#include <stdio.h>
int main(int argc, char * argv[])
{
int i;
float buff[5]; //buff的名称是首地址
float sum=0;
printf("输入成绩:");
for(i=0;i<5;i++)
{
scanf("%f",&buff[i]);
}
for(i=0;i<5;i++)
{
sum+=buff[i];
}
printf("sum=%f\n",sum/5);
return 0;
}
复制代码
5. *号显示中文
6. 显示中文
通过*号打印出自己的名字。
#include <stdio.h>
int main(int argc, char * argv[])
{
unsigned char buff[]={0x08,0x08,0x7E,0x4A,0x7E,0x08,0x08,0x08};
int i,j;
unsigned char data;
for(i=0;i<8;i++)
{
data=buff[i];
for(j=0;j<8;j++)
{
if(data&0x80)printf("*");
else printf(" ");
data<<=1; //依次判断高位
}
printf("\n");
}
return 0;
}
/*
8*8
0000 1000 0x08
0000 1000 0x08
0111 1110 0x7E
0100 1010 0x4A
0111 1110 0x7E
0000 1000 0x08
0000 1000 0x08
0000 1000 0x08
*/
汉字显示示例代码:
#include <stdio.h>
int main(int argc, char * argv[])
{
unsigned char buff[]=
{
/*-- 文字: 中 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x3F,0xF8,0x21,0x08,0x21,0x08,0x21,0x08,
0x21,0x08,0x21,0x08,0x3F,0xF8,0x21,0x08,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,
};
int i,j;
int cnt=0;
unsigned char data;
for(i=0;i<32;i++)
{
data=buff[i];
for(j=0;j<8;j++)
{
if(data&0x80)printf("*");
else printf(" ");
data<<=1; //依次判断高位
cnt++;
}
if(cnt==16)
{
cnt=0;
printf("\n");
}
}
return 0;
}
复制代码
6. 数组的数据插入
1.数组的数据插入:
int a[]={1,2,3,4,5,6,7}; 在第2位数据后插入一个888
最终 int a[]={1,2,888,3,4,5,6,7};
#include <stdio.h>
int main(int argc, char * argv[])
{
int buff[50]={1,2,3,4,5,6,7,8,9,10};
int addr=2; //插入的位置(以正常数字计数)
int len=10; //源数组里的数据长度
int data=888; //将要插入的数据
int i;
/*1. 依次将数据向后移动*/
for(i=len-1;i>=addr-1;i--)
{
buff[i+1]=buff[i];
}
buff[addr-1]=data; //插入数据
len++; //长度加1
/*2. 打印最终的结果*/
for(i=0;i<len;i++)
{
printf("%d ",buff[i]);
}
return 0;
}
复制代码
7. 数组数据的删除
2.数组数据的删除
int a[]={1,2,3,4,5,6,7}; 将第2位数据删除掉
最终 int a[]={1,3,4,5,6,7};
#include <stdio.h>
int main(int argc, char * argv[])
{
int buff[50]={1,2,3,4,5,6,7,8,9,10};
int addr=2; //删除的位置(以正常数字计数)
int len=10; //源数组里的数据长度
int i;
/*1. 向前覆盖数据*/
for(i=addr-1;i<len-1;i++)
{
buff[i]=buff[i+1];
}
len--;
/*2.打印最终结果*/
for(i=0;i<len;i++)
{
printf("%d ",buff[i]);
}
return 0;
}
复制代码
8. 数组数据排序----冒泡排序
3.数组数据排序----冒泡排序
int a[]={1,2,3,4,5,6,7}; 最终 int a[]={7,6,5,4,3,2,1};
基本排序
#include <stdio.h>
int main(int argc, char * argv[])
{
//将要排序的数组
int buff[10]={12,67,34,89,54,15,90,58,66,88};
int tmp;
int i,j;
int len=10; //数组的长度
//排序
for(i=0;i<len-1;i++) //比较的轮数
{
for(j=0;j<len-1;j++) //每轮的次数
{
if(buff[j]>buff[j+1])
{
tmp=buff[j];
buff[j]=buff[j+1];
buff[j+1]=tmp;
}
}
}
for(i=0;i<len;i++) printf("%d ",buff[i]);
return 0;
}
优化代码
#include <stdio.h>
int main(int argc, char * argv[])
{
//将要排序的数组
int buff[10]={1,2,3,4,5,6,7,8,9,10};
int tmp;
int i,j;
int len=10; //数组的长度
int cnt=0;
//排序
for(i=0;i<len-1;i++) //比较的轮数
{
for(j=0;j<len-1-i;j++) //每轮的次数
{
if(buff[j]<buff[j+1]) //从大到小排序
{
tmp=buff[j];
buff[j]=buff[j+1];
buff[j+1]=tmp;
}
cnt++;
}
}
printf("cnt=%d\n",cnt);
for(i=0;i<len;i++) printf("%d ",buff[i]);
return 0;
}
最终优化代码
#include <stdio.h>
int main(int argc, char * argv[])
{
//将要排序的数组
int buff[10]={1,2,3,4,5,6,7,8,9,10};
int tmp;
int i,j;
int len=10; //数组的长度
int cnt=0;
int flag=0; //是否需要排序的标志位
//排序
for(i=0;i<len-1;i++) //比较的轮数
{
for(j=0;j<len-1-i;j++) //每轮的次数
{
if(buff[j]>buff[j+1]) //从小到大排序
{
tmp=buff[j];
buff[j]=buff[j+1];
buff[j+1]=tmp;
flag=1; //标记排序一次
}
cnt++;
}
if(flag) //上一次排过序
{
flag=0; //清除标志位
}
else
{
break;
}
}
printf("cnt=%d\n",cnt);
for(i=0;i<len;i++) printf("%d ",buff[i]);
return 0;
}
复制代码
9. 数组拼接
4.数组数据的拼接
int a[]={1,3,4,5,6,7}; int b[]={11,13,14,15,16,17};
将a和b拼接到c数组里。 最终int c[]={1,3,4,5,6,7, 11,13,14,15,16,17}
示例:
#include <stdio.h>
int main(int argc, char * argv[])
{
int buff1[50]={1,2,3,4,5,6,7,8,9,10};
int buff2[10]={11,12,13,14,15,16,17,18,19,20};
int len1=10; //源数据长度
int len2=10; //插入的数据长度
int i;
for(i=0;i<len2;i++)
{
buff1[len1+i]=buff2[i]; //实现数据拼接
}
len1+=len2;//最终数据长度
for(i=0;i<len1;i++)
{
printf("%d ",buff1[i]);
}
return 0;
}
复制代码
10. 字符串查找与替换
字符串数组有一个约定: 结尾有’\0’
char buff[]={'A','B','C','D'}; //字符数组定义
char buff[]="ABCD"; //字符串数组定义
char buff[]={'A','B','C','D','\0'}; //字符串数组定义
“” //双引号之前默认有’\0’
#include <stdio.h>
int main(int argc, char * argv[])
{
char str[]="嵌入式开发"; //字符串数组--文本数据
int i=0;
for(i=0;str[i]!='\0';i++){}
printf("i=%d\n",i);
return 0;
}
查找与替换
#include <stdio.h>
int main(int argc, char * argv[])
{
int buff[]={123,456,123,56,567,123,567};
int cnt=0,i=0;
for(i=0;i<7;i++)
{
if(buff[i]==123) //查找
{
buff[i]=888; //替换
cnt++;
}
}
printf("cnt=%d\n",cnt);
for(i=0;i<7;i++)
{
printf("%d ",buff[i]);
}
return 0;
}
作业:
1.字符串排序。 “24RERFER8RTBJV”
2.字符串插入: “1234567890”
在第2个位置后面插入”ABC”
最终结果: “12ABC34567890”
3.字符串查找: “123456123abc123hbc”
查找字符串”123”的数量。 数量是3
4.字符串删除: “1234567890”
删除”456” 最终结果: “1237890”
5.字符串替换
字符串”1234567890”
将456替换为”888”
最终: “1238887890”
需要考虑3种情况
复制代码
划线
评论
复制
发布于: 2022 年 05 月 09 日阅读数: 14
版权声明: 本文为 InfoQ 作者【DS小龙哥】的原创文章。
原文链接:【http://xie.infoq.cn/article/8658b8f0f717ce5f82db28c12】。文章转载请联系作者。
DS小龙哥
关注
之所以觉得累,是因为说的比做的多。 2022.01.06 加入
熟悉C/C++、51单片机、STM32、Linux应用开发、Linux驱动开发、音视频开发、QT开发. 目前已经完成的项目涉及音视频、物联网、智能家居、工业控制领域
评论