写点什么

C 语言 _ 数组的查找、替换、排序、拼接

作者:DS小龙哥
  • 2022 年 5 月 09 日
  • 本文字数:4848 字

    阅读完需:约 16 分钟

这篇文章主要是总结 C 语言的位运算几个实战例子,接着介绍数组的基本定义用法、数组排序、插入、拼接、删除、字符串查找替换等。

1. 颜色转换的例子

1.颜色转换的例子:  RGB888  RGB565  RGB666….    int data=12345; //RGB888的颜色   要求将data转为RGB565    -去掉高位 示例:/*int data=101010101010101010101010  11184810
R:01010G:101010B:01010
0101010101001010 21834
1010101000111111*/
#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 11184810c2=101010101010101010101010 11184810
r: 10101g: 101010b: 10101rgb565=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 0x080000 1000 0x080111 1110 0x7E0100 1010 0x4A0111 1110 0x7E0000 1000 0x080000 1000 0x080000 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”的数量。 数量是34.字符串删除: “1234567890”删除”456” 最终结果: “1237890”5.字符串替换字符串”1234567890”将456替换为”888” 最终: “1238887890”需要考虑3种情况
复制代码


发布于: 2022 年 05 月 09 日阅读数: 14
用户头像

DS小龙哥

关注

之所以觉得累,是因为说的比做的多。 2022.01.06 加入

熟悉C/C++、51单片机、STM32、Linux应用开发、Linux驱动开发、音视频开发、QT开发. 目前已经完成的项目涉及音视频、物联网、智能家居、工业控制领域

评论

发布
暂无评论
C语言_数组的查找、替换、排序、拼接_5月月更_DS小龙哥_InfoQ写作社区