单词表的排序 代码错哪里了?

时间限制: 1 Sec  内存限制: 256 MB
提交: 473  解决: 81

输入

请将文本文件word.dic下载保存到当前目录下, 

要求编写C程序,对word.dic中的单词排序,并将排序结果显示在屏幕上。

特别注意,排序时忽略大小写,详见样例数据。

输出

实际的测试文件word.dic不超过3000行,每行包含一个单词(或词组),

每个单词的左侧没有空格之类的多余符号,每个单词(或词组)的总长度不超过30。

样例输入

例如,word.dic的内容为:
Zero
one
two
three
four
five
six
seven
eight
nine
ten

样例输出 

eight
five
four
nine
one
seven
six
ten
three
two
Zero

代码错哪里了?

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main()
{   
    
    int i,j,n=0;
    char str[3050][50],b[50];
    FILE *fp;
    if((fp=fopen("word.dic","r"))==NULL)
   {
    exit(0);
   }

   while(fgets(str[n],50,fp)!=NULL){
      n++;
   }
    for(i=0;i<n-1;i++)
    	for(j=0;j<n-i-1;j++)
	    {
            if(strlen(str[j])>strlen(str[j+1]))
		    {
               strcpy(b,str[j]);
               strcpy(str[j],str[j+1]);
               strcpy(str[j+1],b);
            }
        }
    for(i=0;i<n;i++)
	{
        printf("%s\n",str[i]);
    }
}

 

应该是比较单词那里错了,根据题目需要忽略大小写,所以可以先备份所有单词,然后把这个备份里的单词全部转为小写再利用strcmp来比较即可,修改如下:

参考链接:

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

// 根据题目意思,忽略大小写,故将所有单词的备份转为小写,以便比较 
void tolowerFun(char  str[][50],int n){
    
    int i=0,j;
    for(j=0;j<n;j++){
        while(str[j][i]!='\0'){
        // https://blog.csdn.net/laozhuxinlu/article/details/51539737
            str[j][i ] = tolower(str[j][i]);
            i++;
        }
    }
    
}

int main()
{   
    
    int i,j,n=0;
    char str[3050][50],strtemp[3050][50],b[50];
    FILE *fp;
    if((fp=fopen("word.dic","r"))==NULL)
   {
    exit(0);
   }
 
   while(fgets(str[n],50,fp)!=NULL){
       //printf("str[%d]=%s",n,str[n]);
         if(str[n][strlen(str[n])-1]=='\n'){  // 去除单词或词组后面的换行符 
                 str[n][strlen(str[n])-1]='\0';
        }
        strcpy(strtemp[n],str[n]);     // 将单词备份全部转为小写,以便忽略大小写比较
      n++;
   }
   tolowerFun(strtemp,n);
   //printf("\n");
   
       char ch1,ch2;
    for(i=0;i<n-1;i++)
        for(j=0;j<n-i-1;j++)
        {
      // 利用strcmp函数来比较单词备份,以便忽略大小写来排列单词 
            if(strcmp(strtemp[j],strtemp[j+1])>0)
            {
               strcpy(b,str[j]);
               strcpy(str[j],str[j+1]);
               strcpy(str[j+1],b);
               
               strcpy(b,strtemp[j]);
               strcpy(strtemp[j],strtemp[j+1]);
               strcpy(strtemp[j+1],b);
            }
        }
        
        //打印结果 
    for(i=0;i<n;i++)
    {
        printf("%s\n",str[i]);
    }
}

word.dic(单词内容):

Zero
one
two
three
four
five
six
seven
eight
nine
ten

img