C语言每日一题之No.9

时间:2022-06-01 12:55:00

再做决定之前,我还是做好自己该做的。我不希望几年后会悔恨自己为什么在最该努力的时候不愿意吃苦。尊敬的女王陛下,请接题:

一.题目:有已按升序排好顺序的字符串a,编写程序将字符串s中的每个字符按升序的规则插到字符串a中,最后输出”abdefghjkmnptwy”。

二.思路:既然是已经排好序的,就用二分法查找的思想

将字符串s中的每个字符依次作为key拿来和字符串a做比较并且插入

三.程序

 #include <stdio.h>
#include <string.h> #define SIZE 50 void InsertStr(char *s,char *a,int low,int high)
{
int mid = ; while(*a)
{
mid = (low+high)/; //当mid位置字符<*a<mid+1位置字符或者mid位置字符等于*a时
if((s[mid]<*a) && (s[mid+]>*a) || s[mid]==*a)
{
for(int j=mid+;*(s+j);j++)
{
s[j] = *a;//把*a插入到字符串s中mid+1的位置
s[j+]=s[j+];//并且字符串s从mid+2开始的位置全部往后挪一个位置
high = high +;//若每插入一个*a字符,则右区间要加1
}
}
else if(s[mid] >*a)
{ //若mid位置对应的字符大于*a,则右区间变为mid
high = mid;
InsertStr(s,a,low,high);
}
else if(s[mid] <*a)
{ //若mid位置对应的字符小于*a,则左区间变为mid
low = mid;
InsertStr(s,a,low,high); } a++;
} } int main(void)
{
char s[SIZE]={};
char a[SIZE]={}; printf("Please input the s string:\n");
scanf("%s",s);
printf("Please input the a string:\n");
scanf("%s",a); InsertStr(s,a,,strlen(s));
printf("%s",s); return ; }

三.编译运行

程序出错

四.分析问题

1.在插入字符串那个if条件语句里,犯了一个错误:往后面挪的时候,前面的已经把后面的覆盖了,比如a[6]=a[5],然后a[7]=a[6],看到没,这个时候a[6]已经被a[5]覆盖了,它再往后挪都不是自己原来的值了,所以要从最后面开始挪,这样才不会被覆盖。

2.*a可以肯定的是插在s[mid+1]的位置,所以直接s[mid+1]=*a;//把*a插入到字符串s中mid+1的位置就可以了,不然s[mid+1]的值会被*a覆盖

3.每插入一个字符都需要重新获取high

五.程序

 #include <stdio.h>
#include <string.h> #define SIZE 50 void InsertStr(char *s,char *a,int low,int high)
{
int mid = ; while(*a)
{ mid = (low+high)/; //当mid位置字符<*a<mid+1位置字符或者mid位置字符等于*a时
if((s[mid]<*a) && (s[mid+]>*a) || s[mid]==*a)
{
for(int j=strlen(s)-;j>=mid+;j--)
{
s[j+]=s[j];//并且字符串s从mid+2开始的位置全部往后挪一个位置
}
s[mid+]=*a;//把*a插入到字符串s中mid+1的位置 }
else if(s[mid] >*a)
{ //若mid位置对应的字符大于*a,则右区间变为mid
high = mid;
InsertStr(s,a,low,high);
}
else if(s[mid] <*a)
{ //若mid位置对应的字符小于*a,则左区间变为mid
low = mid;
InsertStr(s,a,low,high); } a++;
high =strlen(s);//每个字符串a都要重新获取s字符串的长度
} } int main(void)
{
char s[SIZE]={};
char a[SIZE]={}; printf("Please input the s string:\n");
scanf("%s",s);
printf("Please input the a string:\n");
scanf("%s",a); InsertStr(s,a,,strlen(s));
printf("%s",s); return ; }

还是无法跳出InsertStr()函数,突然记起来要在函数末尾加一个return

        a++;
high =strlen(s);//每个字符串a都要重新获取s字符串的长度
} return;
}

真的可以跳出来了,但是却还是有问题,现在这样的运行结果是

C语言每日一题之No.9

六.到底哪里出了问题呢?

七.给出网上的解答版本

 #include<stdio.h>
#include<string.h>
void main()
{
char a[]="bdfhjmptwy"; //升序
char s[ ]="ganke";
char *p1=a,*p2=s,*p=NULL;
while(*p2)
{
while(*p1)
{
if(*p2>*p1) p1++;
else break;//要有出口!!!!
}
p=p1;//保存指针的位置!!!
while(*p1) p1++;
while(p1!=p)
{
*(p1+)=*p1;
p1--;
}
*(p1+)=*p1;
*p=*p2;
p2++;
p1=a;//指针复原很重要!!!!
}
puts(a);
}

八.对比

那,鉴于你有这样的毅力,明天犒劳你一个又红又脆的苹果+一盒特仑苏纯牛奶哇~