嵌入式全栈开发学习笔记---C语言(编程题9~16)

目录

9.查找字符数组中字符位置(输入hello e    输出2);

10、查找字符数组中字符串的位置(输入hello ll 输出3);

11、字符数组中在指定位置插入字符;(输入hello 3 a   输出heallo)

12、在字符数组中指定开始位置插入字符串;(输入hello 3 aa  输出heaallo)

13、有n个人围成一圈,顺序排号,从第一个开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位?(约瑟夫环,笔试常考)

14、输入一个字符串,计算字符串中子串出现的次数。

15、编写一个C函数,将”I am from shanghai ”倒置为”shanghai from am I”,即将句子中的单词位置倒置,而不改变单词内部结构。

第一步:获取键盘输入的几个单词,

第二步:转置每个单词里面的每一个字母,

第三步:将每一个单词里面的字母单独装置

16、输入一个字符串,同时输入帧头和帧尾(可以是多个字符),将该字符串中合法的帧识别出来。


上一篇复习了数组和函数,这一篇我们来做第二次的8道编程题

建议新建一个homework目录来存放这8个编程题的程序文件。

上次我们讲过第1~8道编程题了

嵌入式全栈开发学习笔记---C语言笔试复习大全7(编程题1~8)-CSDN博客

这次我们开始讲第9~16道:

9.查找字符数组中字符位置(输入hello e    输出2);

提示:我们只要遍历数组,将数组中的每一个元素和该字符对比,直到相等,则输出字符的位置。

参考代码:

#include <stdio.h>
#include <string.h>

int get_char_index(char str[],char ch)
{

    int i;
    int length=strlen(str);
    for(i=0;i<length;i++)
    {
        if(ch==str[i])
        {
            return i+1;
        }
    }   
    return -1;
}

int main()
{
    char str[32]={0};
    char ch;
    printf("输入 字符串 字符\n");
    scanf("%s %c,str,&ch);
    int index=get_char_index(str,ch);
    if(-1==index)
    {
        printf("没有该字符\n");
    }
    else
    {
        printf("该字符的地址是%d\n",index);

    }
    return 0;
}

                

运行结果:

10、查找字符数组中字符串的位置(输入hello ll 输出3);

提示:用strncmp()字符串处理函数比较两个字符,如果相等则输出字符串的位置。

参考代码:

#include <stdio.h>
#include <string.h>

int get_sub_index(char str[],char sub[])
{
    int length_str=strlen(str);
    int length_sub=strlen(sub);
    int i;
    for(i=0;i<length_str-length_sub+1;i++)
    {   
        if(strncmp(str+i,sub,length_sub)==0)
        {
            return i+1;
        }
    }   
    return -1;
}

int main()
{
    char str[32]={0};
    char sub[32]={0};

    printf("输入 字符串 要查找的字符串\n");
    scanf("%s %s",str,sub);

    int index=get_sub_index(str,sub);

    if(-1==index)
    {
        printf("没有要查找的字符串\n");
    }
    else
    {
        printf("该字符串的位置是%d\n",index);
    }
    return 0;
}

运行结果:

11、字符数组中在指定位置插入字符;(输入hello 3 a   输出heallo)

我们可以把后面三个字符向后移动三位,然后将a放在第三个位置,然后将那三个字符赋值给后面三个位置。

参考代码:

#include <stdio.h>
#include <string.h>

int main()
{
    int num;
    int ch;
    char str[32]={0};
    int i;

    printf("输入 字符串 插入位置 插入字符\n");
    scanf("%s %d %c",str,&num,&ch);
    int length=strlen(str);//计算字符串长度

    for(i=0;i<length-num+1;i++)
    {   
        str[length-i]=str[length-1-i];  //移动后三位字符
    }   

    str[num-1]=ch;//插入字符
    printf("%s\n",str);
    return 0;
}

运行结果:

12、在字符数组中指定开始位置插入字符串;(输入hello 3 aa  输出heaallo)

提示:将he用strncpy拷贝到另外一个字符数组里面,然后用strcat将he和aa拼接起来,再将剩下的llo接在heaa后面,最后用strcpy将heaallo拷贝回原来的数组中去。

参考代码:

#include <stdio.h>
#include <string.h>

void insert_str(char str[],char insert[],int num)
{
    int length_str=strlen(str);
    int length_insert=strlen(insert);
    char tmp[32]={0};

    strncpy(tmp,str,num-1);
    strcat(tmp,insert);
    strcat(tmp,str+num-1);
    strcpy(str,tmp);
}

int main()
{
    char str[32];
    char insert[32];
    int num;

    printf("请输入 字符串 要插入的字符串 要插入的位置\n");
    scanf("%s %s %d",str,insert,&num);
    int length_str=strlen(str);
    if(num<=length_str)
    {   
     insert_str(str,insert,num);
    }   
    else
    {   
        printf("字符串长度不够,请重新确认要插入的位置\n");
    }  
    printf("%s\n",str);
    return 0;
}

运行结果:

13、有n个人围成一圈,顺序排号,从第一个开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位?(约瑟夫环,笔试常考)

提示:题目的意思请看图:

参考代码:

#include <stdio.h>

int main()
{
    int num;//总人数
    int person;//剩余人数
    int flag[1024]={0};//每个人的状态位,0保持,1出局
    int k=1;//报数
    int i=1;//flag数组下标

    printf("请输入游戏人数\n");
    scanf("%d",&num);
    person=num;

    while(person>1)//当剩余人数大于1就继续报数
    {   
        //每一次报数
        if(flag[i]==0)//没有出局的人
        {
            k++;//报数
            if((k>3)
            {
                flag[i]=1;//报到3的出局
                person--;//剩余人数减1
                k=1;//重新报数
            }
        }
            i++;//为了下一轮报数的时候先判断这个人还是不是0
            if(num+1==i){i=1;}//重新开始,从1号这人开始
    }

    //找出状态位为0的那个人
    for(i=1;i<num+1;i++)
    {
        if(flag[i]==0)
        { printf("剩下的那个人是第%d号\n",i);
            break;
        }
    }   
 return 0;
}

运行结果:

14、输入一个字符串,计算字符串中子串出现的次数。

提示:用strncmp进行比较,如果比较的结果是0,那就计数count++

参考代码:

#include <stdio.h>
#include <string.h>

int get_sub_count(char str[],char sub[])
{
    int length_str=strlen(str);
    int length_sub=strlen(sub);
    int i;
    int count=0;
    for(i=0;i<length_str-length_sub+1;i++)
    {   
        if(!strncmp(str+i,sub,length_sub))
        {
            count++;
        }
    }   
    return count;
}

int main()
{
    char str[32]={0};
    char sub[32]={0};

    printf("请输入 字符串 要计算的子串\n");
    scanf("%s %s",str, sub);
    int count=get_sub_count(str,sub);
    printf("子串的次数为%d\n",count);
    return 0;
}

运行结果:

15、编写一个C函数,将”I am from shanghai ”倒置为”shanghai from am I”,即将句子中的单词位置倒置,而不改变单词内部结构。

提示:先将整个句子倒转成”iahgnahs.....ma I.”,然后对单个单词进行倒转”shanghai....am I”。这道题使用gets()和scanf()来获取句子是不行的,我们要使用一个新的函数叫getchar()函数可以获取整个句子,空格也是字符,它遇到换行的时候结束。

第一步:获取键盘输入的几个单词,

参考代码:

#include <stdio.h>

int main()
{
    char str[1024]={0};
    int i=0;
    char ch;

    printf("请输入几个单词\n");
    while(ch!='\n')
    {   
        ch=getchar();//从键盘中获取单个字符
        str[i]=ch;
        i++;
    }   
    printf("%s\n",str);
    return 0;
}

运行结果:

第二步:转置每个单词里面的每一个字母,

参考代码:

#include <stdio.h>

void reverse(char str[], int start,int end)
{
    int i;
    char tmp;//交换专用变量
    for(i=0;i<(start+end)/2;i++)
    {
        int tmp=str[end-1-i];
        str[end-1-i]=str[start+i];
        str[start+i]=tmp;
     }   
}

int main()
{
    char str[1024]={0};
    int i=0;
    char ch;

    printf("请输入几个单词\n");
    while(ch!='\n')
    {   
        ch=getchar();//从键盘中获取单个字符
        str[i]=ch;
        i++;
    }

     reverse(str,0,i);//0是整个句子的开始位置,i是整个句子的结束位置
     printf("%s\n",str);
     return 0;
}

运行结果:

第三步:将每一个单词里面的字母单独装置

最终参考代码:

#include <stdio.h>

void reverse(char str[], int start,int end)
{
    int i;
    char tmp;//交换专用变量
    for(i=0;i<(end-start)/2;i++)
    {   
        int tmp=str[end-1-i];
        str[end-1-i]=str[start+i];
        str[start+i]=tmp;
    }   
}

int main()
{
    char str[1024]={0};
    int i=0;
    char ch;
    printf("请输入几个单词(单词)\n");
    while((ch=getchar())!='\n')
    {   
        str[i++]=ch;
    }   
    reverse(str,0,i);//0是整个句子的开始位置,i是整个句子的结束位置
    i=0;
    int begin=0;
    while(str[i]!='\0')//翻转所有单词
    {
        if(str[i]==' ')//翻转一个单词
        {
            reverse(str,begin,i);
            begin=i+1;//下一个单词的开始
        }
        i++;//下一个字符
    }
    reverse(str,begin,i);//'\0'之前的一个单词
    printf("%s\n",str);
    return 0;
}

最终运行结果:

16、输入一个字符串,同时输入帧头和帧尾(可以是多个字符),将该字符串中合法的帧识别出来。

提示:帧头和帧尾分别是head和tail,字符串”asdheadhauboisoktail”中headhauboisoktail是合法帧。

可以先找到帧头和帧尾的位置,最后把帧头和帧尾的位置之间的字符拷贝到另一个数组中打印出来。

参考代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int get_index(char str[],char sub[])
{
    int length_str=strlen(str);
    int length_sub=strlen(sub);
    int i;

    for(i=0;i<length_str-length_sub+1;i++)
    {
        if(strncmp(str+i,sub,length_sub)==0)
        {
            return i;
        }
    }   
    return -1; 
}
int main()
{
    char str[32]={0};
    char head[32]={0};
    char tail[32]={0};
    printf("请输入 字符串 帧头 帧尾\n");
    scanf("%s %s %s",str, head, tail);

    int index_head=get_index(str,head);
    int index_tail=get_index(str,tail);

    if(-1==index_head||-1==index_tail)
    {
        printf("输入有误\n");
        exit(1);//退出整个程序
    }

    char tmp[32]={0};
    int length_tail=strlen(tail);
    strncpy(tmp,str+index_head,index_tail-index_head+length_tail);

    printf("%s\n",tmp);
    return 0;
}

运行结果:

以上就是这篇内容,如想了解更多,欢迎订阅本专栏!

如有问题可评论区或者私信留言,如果想要进交流群请私信!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Vera工程师养成记

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值