嵌入式学习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");
    }
  1. 变量和常量的比较
    //输入一个字符串,如果是"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’}}

    1. 部分初始化

char a[3][5]={ {“ab”},{“DF”},{“14”}}; 默认使用’\0’填充
char a[3][5]={ “ad”,“ADF”}; 常用
char a[2][5]={{‘a’,‘b’},{‘a’,‘b’,‘c’}}

  1. 特殊初始化

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]);
    }
    1. 特殊情况:当每个字符串长度和字符数组空间一样时
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");
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值