目录
10、查找字符数组中字符串的位置(输入hello ll 输出3);
11、字符数组中在指定位置插入字符;(输入hello 3 a 输出heallo)
12、在字符数组中指定开始位置插入字符串;(输入hello 3 aa 输出heaallo)
13、有n个人围成一圈,顺序排号,从第一个开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位?(约瑟夫环,笔试常考)
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;
}
运行结果:
以上就是这篇内容,如想了解更多,欢迎订阅本专栏!
如有问题可评论区或者私信留言,如果想要进交流群请私信!