当前位置: 代码迷 >> C语言 >> 麻烦大家了!
  详细解决方案

麻烦大家了!

热度:345   发布时间:2007-11-30 22:38:10.0
麻烦大家了!
题目是:
        用数组和函数实现如下程序:
        ――函数1:从键盘输入10个字符串(长度均不超过10)
        ――函数2:对上述10个字符串用“选择法”依字典序进行排序(按从小到大)。
        ――函数3:用“折半查找”在10个字符串中检索给定字符串。
     ――主程序:调用函数1->调用函数2->循环接收键盘输入的字符串(长度不超过10)直到输入为空串,每接收到一个字符串就调用函数3进行查找并打印查找结果。
以下是我的程序:
#include<stdio.h>
#include<string.h>
char a[10][10];
void scan()
{
int i;
char temp2[10]="error";
for(i=0;i<=9;i++)
{
  printf("Please input the character string:\n");
  scanf("%s",a[i]);
        if(strlen(a[i])>10)
  {
   strcpy(a[i],temp2);
   i--;
  }
}
}
void sort(char a[][10],int n)
{
int j,k;char temp[10];
for(j=0;j<=n-1;j++)
{
  for(k=j+1;k<n;k++)
   if(strcmp(a[k],a[j])<=0)
   {
       strcpy(temp,a[j]);
    strcpy(a[j],a[k]);
    strcpy(a[k],temp);
   }                          
}
}
int binsearch(char a[][10],char l[],int m)
{
int low,mid,high;
low=0;high=m-1;
while(low<=high)
{
  mid=(low+high)/2;
  if(strcmp(l,a[mid])==0)return mid;
  if(strcmp(l,a[mid])<0) high=mid-1;
  else low=mid+1;
}
return(-1);
}
int main()
{
int p,q;
scan();
printf("Get the character strings:\n");
for(p=0;p<=9;p
  ++)
  printf("%s\n",a[p]);
sort(a,10);                 
printf("Sort the character strings:\n");
for(q=0;q<=9;q++)
     printf("%s\n",a[q]);
int t,goal;
char search[10];
for(t=0;search[0]!='\n';t++)
{
  printf("Please input the character string you want to search:\n");
  gets(search);
  if(strlen(search)>10)
  {
   printf("INPUT ERROR!\n");
   continue;
  }
  else if(strlen(search)>=1&&strlen(search)<=10)
  {
   goal=binsearch(a,search,10);
      if(goal!=-1)
      {
       printf("the character string is the %dth in 10.\t\t",goal+1);
    printf("%s\n",a[goal]);
   }
      else printf("DON'T FIND THE CHARACTER YOU WANT.\n");
  }
}
return 0;
}
问题1:在scan函数中正好输入10长度的会出现输出问题。而在超过10长度时就会按照要求舍去呢?
问题2:为什么在最后输入search时直接enter无法结束程序,而在函数中加个search[0]=='\0'或'\n'作为条件时会在不输入search值使直接结束程序呢?而用search=="\0"或"\n"会继续循环。那如何才能符合题目要求结束程序。我对空串理解是直接enter就退出,怎么解决?还是我有关空串这个词有无解呢?
搜索更多相关的解决方案: 麻烦  

----------------解决方案--------------------------------------------------------
问题1:当字符串的长度最长为10时,字符数组的长度应该为11,最后一个字节放‘\0’;
问题2:判断search[0]!='\0'就可以了,但是在循环之外,要赋值search[0] 为一个非0的数据;
char search[10];  
search[0] = 'a';
for(t=0;search[0]!='\0';t++)
还有一点防止 t  越界;实际上在循环中完全可以把  t  省略。
----------------解决方案--------------------------------------------------------
  相关解决方案