嵌入式学习day7
一.字符串函数
头文件 #include <string.h>
字符串函数只能对字符串实现操作
1.1 strlen:字符串长度
使用格式:strlen(字符串);
作用: | 计算字符串长度【不计算\0】 |
---|---|
格式 | size_t strlen(const char *s); |
返回值 | size_t 等价于unsigned int [输出格式控制%u %ld] |
参数 | 一个参数,const不可以改变 |
字符串:可以是变量、常量
1> 计算变量的长度
char str[]="hello word";
printf("长度是:%ld",strlen(str));
int n=strlen(str);
printf("长度是:%d\n",n);
2>计算常量的长度
注意:当计算汉字字符串长度时
如果是UTF-8一个汉字3字节,GBK一个汉字2字节
//计算常量字符串的长度
printf("常量1=%ld\n",strlen("asdf"));
printf("常量2=%ld\n",strlen("华清远见"));
3>使用非函数方法计算长度
//使用非函数的方法,计算字符串长度
int count=0;
for(int i=0;str[i]!=0;i++)
{
count++;
}
printf("字符串长度=%d\n",count);
//使用while循环
int i=0; //"abc\0" if(a) if(a!=0)
while(str[i])//等价while(str[i]!=0
)
{
i++;//表示字符串长度
}
printf("字符串是:%d\n",i);
1.2 strcpy:赋值字符串
使用格式: strcpy( 字符串1 , 字符串2) 把字符串2值赋值给字符串1 等价【str1=str2】
作用: | 字符串拷贝 【字符串相互之间赋值】 |
---|---|
格式 | char *strcpy(char *dest, const char *src); |
返回值 | char * 字符串,返回的dest拷贝后的字符串 |
参数 | 2个参数,dest:表示目标字符串 src不可以改变,源字符串 |
注:
字符串1:只能是变量
字符串2:可以是变量,可以是常量
注意:在拷贝时,字符串1的长度必须比字符串2大,否则出现越界存储的问题。
1.字符串2是变量
char a[20]="abcd";
char b[]="abcdefg";
printf("字符串=%s\n",strcpy(a,b));
char c[]="hello";
strcpy(a,c);
printf("字符串a=%s\n",a);
2.字符串2是常量
strcpy(a,"华清远见");
printf("a=%s\n",a);
printf("字符串是:%s\n",strcpy(a,"hello"));
3.非函数实现拷贝
char str1[20]="abcdefg";
char str2[]="ppp";
int i;
for( i=0;str2[i];i++)
{
str1[i]=str2[i];
}
str1[i]=str2[i];
str1[i]='\0';
puts(str1);
1.3 strcat :连接字符串
使用格式:
strcat( 字符串1, 字符串2);
字符串1:只能变量
字符串2:可以是变量,也可以是常量
注意:字符串1的长度需要足够大,否则段错误
作用: | 字符串连接 |
---|---|
格式 | char *strcat(char *dest, const char *src); |
返回值 | 返回字符串 ,返回dest连接后的值 |
参数 | 2个参数,dest目标字符串,src源字符串,不可以改变 |
1.字符串2为变量
char str[20]="1234";
char str2[]="abcd";
strcat(str,str2);//把字符串str2链接到str的后面,str变 str2不变
printf("链接后=%s\n",str);
char str3[]="!@#$";
printf("链接收=%s\n",strcat(str,str3));
2.字符串为常量
printf("字符串=%s\n",strcat(str,"华清远见"));
3.非函数实现链接
char a[20]="ASDF\0",b[]="1234";
// i j
//找到a的\0的下标
int i;
for(i=0;a[i];i++);//循环到字符串a的最后一个下表
int j;
for(j=0;b[j];j++)//循环字符串b
{
a[i++]=b[j];
}
a[i]='\0';
puts(a);
1.4 strcmp:比较字符串
两个字符串自左向右逐个字符相比(按ASCII值大小相比较),直到出现不同的字符或遇’\0’为止
strcmp(字符串1,字符串2)
当字符串1> 字符串2 if( strcmp(s1,s2) >0)
当字符串1< 字符串2 if( strcmp(s1,s2) <0)
当字符串1= 字符串2 if( strcmp(s1,s2) ==0)
作用: | 字符串比较大小 |
---|---|
格式 | int strcmp(const char *s1, const char *s2); |
返回值 | int 字符串的ASCII的差值 |
参数 | 2个参数 |
char a[]=“Abcd”, b[]=“Abc\0”
字符串1和字符串2既可以是常量,也可以是变量
1.变量和变量的比较
char a[]="abc",b[]="Bbc",c[]="abc";
printf(" 比较结果:%d\n",strcmp(a,b));//a-b
printf(" 比较结果:%d\n",strcmp(b,a));//b-a
printf(" 比较结果:%d\n",strcmp(a,c));
if( strcmp(a,b) >0 )
{
printf("a>b\n");
}
else if( strcmp(a,b) <0)
{
printf("a<b");
}
else if( strcmp(a,b) ==0)
{
printf("a==b");
}
- 变量和常量的比较
//输入一个字符串,如果是"ILOVECHINA" 输出热爱中国
// "IHATECHINA" 输出不友好
char str[20]="";
printf("请输入一个字符串:");
scanf("%s",str);
if( strcmp(str,"ILOVECHINA") ==0)
{
printf("热爱中国\n");
}
else if( strcmp(str,"IHATECHINA") ==0)
{
printf("不友好\n");
}
3.非函数实现字符串比较
char str1[20]="";
char str2[20]="";
printf("请输入两个字符串:");
scanf("%s %s",str1,str2);
//ABCD
//ABC
//
//ABCD
//ABc
int i=0,j=0;
while(str1[i] == str2[j])
{
if(str1[i]=='\0')
break;
i++;
j++;
}
int dev=str1[i]-str2[j];
if(dev >0)
printf("str1>str2");
else if(dev<0)
printf("str1<str2");
else
printf("str1=str2");
字符串函数练习
1> 实现两个字符串的交换
//用冒泡排序的思维,逐渐将最大(小)的推到后(前)面
strcpy(t,b);strcpy(b,c);strcpy(c,t);
2> 输入三个字符串,按照从大到小的顺序实现字符串连接
int main(int argc, const char *argv[])
{
char a[20]="",b[20]="",c[20]="";
printf("请输入三个字符串:");
scanf("%s %s %s",a,b,c);
//a b c
//"1" "4" "7"
/*
第一轮:
第一个和第二个
a b
if(a>b) 交换
第二个和第三个
b c
if(b>c) 交换
第二轮:
第一和和第二个
a >b 交换*/
char t[20]="";
if( strcmp(a,b) >0)
{
strcpy(t,a);strcpy(a,b);strcpy(b,t);
}
if( strcmp(b,c) >0)
{
strcpy(t,b);strcpy(b,c);strcpy(c,t);
}
if( strcmp(a,b) >0)
{
strcpy(t,a);strcpy(a,b);strcpy(b,t);
}
strcat(c,b);
strcat(c,a);
printf("按照顺序链接后的结果是:%s\n",c);
二.二维字符数组
- char a; 一个单字符
- char a[50]; 一个字符串【50个单字符】
- char a[5][50] 5行50列 5个字符串,每个字符串50个字符
2.1 定义格式
格式:char 数组名[常量表达式1][常量表达式2];
数组名:满足命名规范
常量表达式1:行数,字符串的个数
常量表达式2:列数,每个字符串的存储单字符的最大个数
char str[5][10]; 有5个字符串,每个字符串最大10个单字符
2.2 二维字符数组的初始化
- 1 .全部初始化
char a[3][5]={ {“abcd”},{“ASDF”},{“1234”}};
char a[3][5]={ “abcd”,“ASDF”,“1234”}; 常用
char a[2][5]={{‘a’,‘b’,‘c’,‘d’,‘\0’},{‘a’,‘b’,‘c’,‘d’,‘\0’}}
-
- 部分初始化
char a[3][5]={ {“ab”},{“DF”},{“14”}}; 默认使用’\0’填充
char a[3][5]={ “ad”,“ADF”}; 常用
char a[2][5]={{‘a’,‘b’},{‘a’,‘b’,‘c’}}
- 特殊初始化
char a[][5]={ “abcd”,“ASDF”,“1234”}; 常用,计算机自己计算行数
2.3二维数组引用
- 1.按列引用二维字符数组
char a[3][5]={"ASDF","qwer","1234"};
for(int i=0;i<3;i++)
{
for(int j=0;j<5;j++)
{
printf("%c",a[i][j]);
}
printf("\n");
}
- 2.按行引用二维字符数组【常用】
for(int i=0;i<3;i++)
{
printf("%s\n",a[i]);
}
-
- 特殊情况:当每个字符串长度和字符数组空间一样时
char b[3][5]={"ASDFG","qwert","1234"};
for(int i=0;i<3;i++)
{
printf("%s\n",b[i]);
}
二维字符数组的练习
1>循环输入5个字符串,并输出
char a[5][20]={0};
for(int i=0;i<5;i++)
{
scanf("%s",a[i]);
}
for(int i=0;i<5;i++)
{
printf("%s",a[i]);
}
2> 输入5个字符串,计算最大字符串
char a[5][20]={0};
for(int i=0;i<5;i++)
{
scanf(“%s”,a[i]);
}
char max[20]=“”;
for(int i=0;i<5;i++)
{
if(i==0)
{
strcpy(max,a[i]);
}
if(strcmp(max,a[i])<0)//if(max<a[i])
{
strcpy(max,a[i]);//max=a[i];
}
}
printf(“max=%s”,max);
3> 输入6个字符串,查找字符串key在二维字符数组中是否出现
//查找
char key[20]="";
int count=0;
printf("请输入查找的字符串:");
scanf("%s",key);
for(int i=0;i<6;i++)
{
if(strcmp(key,a[i])==0)
{
count++;
}
}
if(count==0)
printf("不存在\n");
else
printf("存在\n");*/
4> 输入10个人名字,升序排序
char a[10][20]={0};
//循环输入
for(int i=0;i<10;i++)
{
printf("请输入%d个名字:",i+1);
scanf("%s",a[i]);
}
//冒泡
for(int i=1;i<10;i++)
{
int count=0;
for(int j=0;j<10-i;j++)
{
if(strcmp(a[j],a[j+1])>0)//if(a[j] > a[j+1])
{
//t=a[j];a[j]=a[j+1];a[j+1]=t;
char t[20]="";
strcpy(t,a[j]);
strcpy(a[j],a[j+1]);
strcpy(a[j+1],t);
count++;
}
}
if(count==0)
break;
}
for(int i=0;i<10;i++)
{
printf("%s ",a[i]);
}
作业
作业1:循环输入字符串[存在空格],对每个单词实现逆序
// C语言专用模板
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/*
程序要求:循环输入字符串[存在空格],对每个单词实现逆序
*/
int main()
{
printf("请输入字符串\n");
char str[50] = "";
gets(str);
// 6 scanf("%s", str);
int len = strlen(str) - 1; // 减1是去掉'\0'的长度
// 实现整体的逆序
int i = 0;
while (i < len)
{
char temp = str[i];
str[i] = str[len];
str[len] = temp;
i++;
len--;
}
puts(str);
// 实现单词逆序
i = 0;
int j = 0;
for (i = 0; i < strlen(str);)
{
// 找空格之前的下标
while (str[j] != '\0' && str[j] != ' ')
{
j++;
}
int k = j - 1;
// 逆置i到k之间的字符
while (i < k)
{
char temp = str[i];
str[i] = str[k];
str[k] = temp;
i++;
k--;
}
// 循环空格
while (str[j] == ' ')
{
j++;
}
i = j;
}
printf("排序后的字符串为: %s\n", str);
system("pause");
}
作业2:字符串this is my class ,计算is的个数
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/*
程序要求:字符串this is my class ,计算is的个数
*/
int main()
{
char str[] = "this is my class";
int len = strlen(str);
int i = 0, count = 0;
while (i < len - 1)
{
if (str[i] == 'i' && str[i + 1] == 's')
{
count++;
}
i++;
}
printf("计算is的个数为%d\n", count);
system("pause");
}