知识点1:字符串 字符串:本身属于字符数组、字符串结尾有’\0’。
1.1 字符串作业 1. 从键盘上输入一串字符串,计算字符串里的空格、大写字母、小写字母、数字个数
2. 字符串比较:从键盘上录入2个字符串,判断是否相等。
#include
int main()
{
char str1[100];
char str2[100];
int i=0;
/*1. 录入数据*/
printf(输入字符串1:);
scanf(%s,str1);
printf(输入字符串2:);
scanf(%s,str2);
/*2. 比较字符串*/
while(str1[i]!='\0'||str2[i]!='\0')
{
if(str1[i]!=str2[i])break;
i++;
}
if(str1[i]=='\0'&&str2[i]=='\0')
{
printf(字符串相等.\n);
}
else
{
printf(字符串不相等.\n);
}
return 0;
}
3. 字符串删除:从键盘上录入一个字符串,删除字符串里指定的单词,输出结果。
比如:原字符串”akjbcds123dfjvbf123fdvbfd123”
删除单词:“123”
输出的结果:”akjbcdsdfjvbffdvbfd”
#include
#include
int main()
{
char str1[100];
char str2[100];
int i=0,j=0;
int str2_len=0;
/*1. 录入数据*/
printf(输入源字符串:);
scanf(%s,str1);
printf(输入要删除的字符串:);
scanf(%s,str2);
/*2. 计算要删除字符串的长度*/
str2_len=strlen(str2);
/*3. 查找字符串*/
for(i=0;str1[i]!='\0';i++)
{
//比较字符串
for(j=0;str2[j]!='\0';j++)
{
if(str1[i+j]!=str2[j])break;
}
if(str2[j]=='\0')
{
//4. 删除字符串---后面向前面覆盖
for(j=i;str1[j]!='\0';j++)
{
str1[j]=str1[j+str2_len];
}
str1[j]='\0';
i--;
}
}
//5. 输出结果
printf(str1=%s\n,str1);
return 0;
}
4. 字符串查找:从键盘上录入一个字符串,查找字符串里有几个特定的单词。再输出结果。
比如:原字符串”akjbcds123dfjvbf123fdvbfd123”
查找的单词:“123”
输出结果:3
5. 字符串排序:从键盘上录入一个字符串,按照小到大的顺序排序。
#include
#include
int main()
{
char str1[100];
int len=0;
int i,j;
int tmp;
printf(输入要排序的字符串:);
scanf(%s,str1);
len=strlen(str1);
//开始排序
for(i=0;i;i++)
{
for(j=0;j;j++)
{
if(str1[j]>str1[j+1])
{
tmp=str1[j];
str1[j]=str1[j+1];
str1[j+1]=tmp;
}
}
}
printf(排序之后的字符串:%s\n,str1);
return 0;
}
6. 字符串的插入:从键盘上录入一个字符串,从指定位置插入一个字符串,再输出结果。
比如:原字符串“1234567890”
(1). 从指定位置插入新的单词。 比如 从第2个下标插入一个“abc”字符串。
结果: “123abc4567890”
#include
#include
int main()
{
char str1[100];
char str2[100];
int addr=0;
int str1_len;
int str2_len;
int i;
/*1. 录入数据*/
printf(录入源字符串:);
scanf(%s,str1);
printf(录入要插入的字符串:);
scanf(%s,str2);
printf(输入要插入的下标位置:);
scanf(%d,&addr);
str1_len=strlen(str1); //3
str2_len=strlen(str2); //2
/*2. 完成插入*/
//完成数据移动
for(i=str1_len-1;i>=addr;i--)
{
str1[i+str2_len]=str1[i];
}
//数据替换
for(i=0;i;i++)
{
str1[i+addr]=str2[i];
}
str1[str1_len+str2_len]='\0';
/*3. 输出数据*/
printf(str1=%s\n,str1);
return 0;
}
(2). 从指定单词后面插入新的单词。 比如 从”123”这个单词后插入一个“abc”字符串。
结果: “123abc4567890”
7. 字符串替换: 从键盘上录入一个字符串,将指定单词替换成想要的单词。
比如:原字符串“123jfvfdj123dkfvbfdvdf”
想要将“123”替换成“888”或者“8888”或者“88”
#include
#include
int main()
{
char str1[100];
char str2[100];
char str3[100];
int str1_len=0;
int str2_len=0;
int str3_len=0;
int i,j;
int cnt=0;
/*1.准备数据*/
printf(输入源字符串:);
scanf(%s,str1);
printf(输入查找的字符串:);
scanf(%s,str2);
printf(输入替换的字符串:);
scanf(%s,str3);
/*2. 计算长度*/
str1_len=strlen(str1);
str2_len=strlen(str2);
str3_len=strlen(str3);
/*3. 字符串替换*/
for(i=0;i;i++)
{
//查找字符串
for(j=0;j;j++)
{
if(str1[i+j]!=str2[j])break;
}
//如果查找成功就进行替换
if(j==str2_len)
{
//总长度变短了
if(str2_len>str3_len)
{
cnt=str2_len-str3_len; //差值
//完成数据向前移动--覆盖
for(j=i+str2_len-cnt;j;j++)
{
str1[j]=str1[j+cnt];
}
str1[str1_len-cnt]='\0';
}
//总长度变长了
else if(str2_len)
{
cnt=str3_len-str2_len; //差值
//完成数据向后移动
for(j=str1_len;j>=i+str2_len;j--)
{
str1[j+cnt]=str1[j];
}
str1[str1_len+cnt]='\0';
}
//替换
for(j=0;j;j++)
{
str1[i+j]=str3[j];
}
//重新计算长度
str1_len=strlen(str1);
}
}
/*4. 完成字符串打印*/
printf(str1=%s\n,str1);
return 0;
}
8. 从键盘上输入一个整数:将整数转为字符串输出。
比如:int a; scanf(“%d”,&a); 使用字符串形式打印出a的值。
#include
#include
int main()
{
char str[100];
char str1[100];
int data=0;
int j=0,i=0;
printf(从键盘上输入整数:);
scanf(%d,&data);
// 123 -->'1' '2' '3'
while(data)
{
str[i++]=data%10+'0';
data=data/10;
}
for(j=0;j;j++)
{
str1[j]=str[i-j-1];
}
str1[j]='\0';
printf(str1=%s\n,str1);
return 0;
}
9. 从键盘上输入一个字符串,转为整数输出。
#include
#include
int main()
{
//123
char str[100];
int data=0;
int i=0;
printf(从键盘上输入字符串:);
scanf(%s,str);
while(str[i]!='\0')
{
data*=10;//data=0 data=10 data=120
data+=str[i]-'0';//data=1 data=12 data=123
i++;
}
printf(data=%d\n,data);
return 0;
}
10. 回文字符串。 “121”,“1221”
11. 将第8题和第9题转成浮点数。
12. 将10进制数据转为16进制输出。 比如: 3 --->0x3
13. 将10进制数据转为二进制输出。
知识点2:字符串到整数-浮点数的格式化转换 //输出的都是字符串
#include
int printf(const char *format, ...);
int fprintf(file *stream, const char *format, ...);
int sprintf(char *str, const char *format, ...); //格式化转换函数
int snprintf(char *str, size_t size, const char *format, ...);
#include
#include
int main()
{
char str[100];
sprintf(str,%s%s%s%d%c%f,123,456,789,666,'a',123.456);
printf(str=%s\n,str);
return 0;
}
//输入的是字符串
#include
int scanf(const char *format, ...);
int fscanf(file *stream, const char *format, ...);
int sscanf(const char *str, const char *format, ...);
#include
#include
int main()
{
float a;
char str[]=123.456;
sscanf(str,%f,&a); //123
printf(a=%f\n,a);
return 0;
}
//字符串转整数
#include
int atoi(const char *nptr);
long atol(const char *nptr);
long long atoll(const char *nptr);
long long atoq(const char *nptr);
知识点3:多维数组 一维数组和二维数组使用频率较高。
一维数组: 定义的时候只有一个下标。 char buff[100];
二维数组: 定义的时候只有二个下标。 char buff[10][100];
二维数组可以看成一个矩阵。char buff[行][列];
3.1 二维数组特点: 二维数组定义的时候,如果赋了初始值,行可以省略掉,列不可用省略。 int main()
{
char data1[3][3]={{1,2,3},{4,5,6},{7,8,9}};
char data2[3][3]=
{
{1,2,3},
{4,5,6},
{7,8,9}
};
//第1个[]指定有多少个一维数组,第2个指定1维数组有多大
char data3[][5]=
{
1,2,3,
4,5,6,
7,8,9
};
return 0;
}
3.2. 二维数组如何访问成员? #include
#include
int main()
{
char data[3][3]=
{
{1,2,3},
{4,5,6},
{7,8,9}
};
printf(第1行的第2列:%d\n,data[1][2]);
char str[][100]={123,456,789,中国,嵌入式};
printf(%s\n,str[3]);// str[3]== char str[]=中国;
return 0;
}
3.3 作业 定义一个int类型的二维数组,比如:[400][400],从键盘上向这个二维数组录入数据,计算二维数组交叉数据之和。 ---计算矩阵交叉—对角线数据的和。
#include
#include
int main()
{
int data[4][4];
int i,j;
//从键盘上录入数据
for(i=0;i<4;i++)
{
for(j=0;j<4;j++)
{
scanf(%d,&data[i][j]);
}
}
return 0;
}
知识点4:一行代码上字符串太长该如何定义? #include
#include
int main()
{
//第一种方法:
char str1[]=1234567890123456789012 \
34567890123456789012345678901234567 \
89012345678901234567890123456789012 \
345678901234567890;
//第二种方法:
char str2[]=1234567890
123456789012345678901234
567890123456789012345678
9012345678901234567890;
printf(str1=%s\n,str1);
printf(str2=%s\n,str2);
return 0;
}
知识点5:一维指针 5.1 指针的概念 指针就是地址。c语言里指针可以直接访问地址,计算机的cpu、外设硬件都是依靠地址操作的。
指针变量如何定义?
#include
#include
int main()
{
char *p1; //定义一个char类型的指针变量
int *p2; //定义一个int类型的指针变量
//int类型的指针变量: 存放地址数据。
int data=123; //定义一个int类型的变量
//int类型的变量: 存储整数数据。
return 0;
}
指针如何使用?
#include
#include
int main()
{
// &data 取地址 a&b 按位与 a&&b 并且
// int *p 定义一个int类型的指针
// *p 取出指针指向空间中的数据--取数据
// a*b a和b乘法
int *p; //指针变量本身就是存放地址的
int data=123;
//p=data; //错误:data本身只是一个变量标识符,不是地址
p=&data; //将data的地址赋值给指针p
printf(*p=%d\n,*p); //取出指针p指向空间中的数据
*p=666; //给指针指向的空间赋值
printf(data=%d\n,data);
return 0;
}
什么是野指针?
野指针就是本身没有合法地址空间---非法指针。
野指针会导致的常见错误:段错误。
下面代码就会导致段错误:
#include
#include
int main()
{
int *p;//指针只能存放地址
*p=123;
printf(*p=%d\n,*p);
return 0;
}
指针本身占的空间是多少?
所有指针类型都占4个字节空间。和类型没有关系。
#include
#include
int main()
{
int *int_p;//指针只能存放地址
int int_a;
char *char_p;//指针只能存放地址
char char_a;
float *float_p;//指针只能存放地址
float float_a;
double *double_p;//指针只能存放地址
double double_a;
printf(int_a=%d\n,sizeof(int_a));//4
printf(int_p=%d\n,sizeof(int_p));//4
printf(char_a=%d\n,sizeof(char_a));
printf(char_p=%d\n,sizeof(char_p));
printf(float_a=%d\n,sizeof(float_a));
printf(float_p=%d\n,sizeof(float_p));
printf(double_a=%d\n,sizeof(double_a));
printf(double_p=%d\n,sizeof(double_p));
return 0;
}
5.2 指针访问数组成员 访问一维数组成员的方式有哪些?
#include
#include
int main()
{
int a[]={1,2,3,4,5,6,7,8,9,0};
int *p;
p=a;
printf(下标4的值:%d\n,a[4]); //5
printf(下标4的值:%d\n,*(a+4)); //5
printf(下标4的值:%d\n,*(p+4)); //5
return 0;
}
指针访问一维数据常用的操作方式:字符串
#include
#include
int main()
{
char str[]=1234567890;
char *p=str;
int len=0;
printf(p=%s,str=%s\n,p,str);
//计算字符串的长度
while(*p++!='\0')
{
len++;
}
printf(len=%d\n,len);
return 0;
}
指针自增和自减?++和—运算符
#include
#include
int main()
{
int a[]={1,2,3,4,5,6,7,8,9,0};
int *p=a;
printf(%d\n,*p); //1
printf(%d\n,*p++); //1
printf(%d\n,*p); //2
printf(%d\n,*(p+3));//5
printf(%d\n,*p);//2
printf(%d\n,*(++p));//3
printf(%d\n,*p);//3
printf(%d\n,*p--);//3
printf(%d\n,*p);//2
return 0;
}
指针自增自减偏移字节是多少? 与指针本身的类型有关系。
#include
#include
int main()
{
/*
int a[]={1,2,3,4,5,6,7,8,9,0};
int *p=a;
printf(偏移之前的地址:p=%#x\n,p);
*(p++);
printf(%d\n,*p); //2
printf(偏移之后的地址:p=%#x\n,p);
*/
char a[]={1,2,3,4,5,6,7,8,9,0};
char *p=a;
printf(偏移之前的地址:p=%#x\n,p);
*(p++);
printf(%d\n,*p); //2
printf(偏移之后的地址:p=%#x\n,p);
return 0;
}
数组本身可以当做指针使用吗?不可以
指针特点: 自增、自减、可以改变指向。
#include
#include
int main()
{
int a[]={1,2,3,4,5}; //*(a+3)
int b[]={11,12,13,14,15};
//下面3行代码是错误的
a--;
a++;
a=b;
return 0;
}
指针可以当做数组使用吗? 可以
数组特点: 可以通过下标访问数组成员。
#include
#include
int main()
{
int a[]={1,2,3,4,5};
int *p=a;
printf(%d\n,a[0]);
printf(%d\n,p[0]); //*p
return 0;
}
5.3 数组指针 数组指针可以指向一个一维数组,行指针也叫一维数组指针。
定义语法: char (*p)[5]; 该指针指向一个二维数组里的一个一维数组地址,一维数组的成员是5个字节。
二维数组的定义方法: char a[10][5];
#include
#include
int main()
{
int (*p)[5]; //定义一个一维数组指针---行指针
int a[2][5]=
{
{1,2,3,4,5},
{6,7,8,9,10}
};
p=a; //将a地址给p指针
printf(%d\n,p[0][2]);
p++; //加一个一维数组的大小
printf(%d\n,p[0][2]);
return 0;
}
5.4 指针数组 指针数组: 表示该数组成员可以存放指针。
指针数组定义语法:int *p[5]; 表示定义一个int数组,该数组的类型可以存放5个int类型的指针变量(地址)。
#include
#include
int main()
{
int a,b,c;
int *p[3]; //一次定义3个int类型的指针变量
//存放地址
p[0]=&a;
p[1]=&b;
p[2]=&c;
//对空间赋值
*p[0]=123;
*p[1]=456;
*p[2]=789;
//取出数据
printf(%d\n,*p[0]);
printf(%d\n,*p[1]);
printf(%d\n,*p[2]);
return 0;
}
#include
#include
int main()
{
char a[][100]={小明,小白,小李};
char *p[]={小明,小白,小李};
printf(%s\n,a[0]);
printf(%s\n,p[0]);
return 0;
}
5.5 字符串查找函数 #include
char *strstr(const char *源字符串, const char *要查找的字符串);
函数功能: 就是在源字符串里查找指定的字符串,查找到之后就返回该字符串的地址。
#include
#include
int main()
{
char str[]=123abc4567890;
char *p;
p=strstr(str,abc);
printf(%s\n,p);
return 0;
}
5.6 指针类型常见的初始化值:null #include
#include
int main()
{
char *p=null; // (void*)0 == null
printf(%#x\n,p);
if(p!=null)
{
//判断指针是否可以使用
}
return 0;
}
5.7 作业:字符串解析 1. 练习上午学习的新知识。
2. 解析gps的数据。gps芯片接收到卫星的信号之后,会通过字符串的形式将解析的数据输出。
#include
#include
int main()
{
char gps_data[]=
{
$gngga,114955.000,2842.4158,n,11549.5439,e,1,05,3.8,54.8,m,0.0,m,,*4f
$gngll,2842.4158,n,11549.5439,e,114955.000,a,a*4d
$gpgsa,a,3,10,31,18,,,,,,,,,,5.7,3.8,4.2*37
$bdgsa,a,3,07,10,,,,,,,,,,,5.7,3.8,4.2*2a
$gpgsv,3,1,10,10,49,184,42,12,16,039,,14,54,341,,18,22,165,23*7b
$gpgsv,3,2,10,22,11,318,,25,51,055,,26,24,205,,29,13,110,*7c
$gpgsv,3,3,10,31,50,287,36,32,66,018,*7f
$bdgsv,1,1,04,03,,,07,05,,,29,07,79,246,33,10,52,232,19*62
$gnrmc,114955.000,a,2842.4158,n,11549.5439,e,0.00,44.25,061117,,,a*4d
$gnvtg,44.25,t,,m,0.00,n,0.00,k,a*14
$gnzda,114955.000,06,11,2017,00,00*47
$gptxt,01,01,01,antenna ok*35
};
return 0;
}
全球半导体厂商20强联发科登上冠军宝座
双绕组电流互感器的设计及应用
上海+商汤:共同推进智慧城市在上海的发展
ATX-3000线束测试仪:汽车线束线缆故障及线缆测试仪应用
【4月20日|上海】三年磨一剑!是德科技华东区首场B5G新技术与测试方案研讨会
C语言_二维数组与一维指针
【节能学院】防火门监控系统在某住宅项目上的应用
让人工智能模型获得人类的联想能力
苹果今晨发布iOS10.2 Beta5版本:新增72个emoji表情
可信赖的银联宝5v1A电源IC U65113E
ROCCAT屡获殊荣的键盘系列再添新宠:MAGMA和PYRO RGB游戏键盘
三星将于5月3日在欧洲15个国家推出Galaxy Fold
台积电拟1034.8亿元新台币扩充产能 全力冲刺7纳米制程拉大竞争对手差距
如何用电阻法巧判压电陶瓷片质量
iPhone没有诞生前,手机王者是它,携诺基亚6代重返颠覆路!
如何为DC-DC选择适合的电感和电容
iphone8什么时候上市?iphone8竟然支持AR?
基于HSR/PRP冗余协议为现代列车配备安全可靠的通信网络
电路语义工具将硬IP转换为可合成模型
穿越电缆因产品质量问题被给予暂停电缆中标资格2个月