小白兔奶糖ovo 2021-06-25 16:03 采纳率: 0%
浏览 29

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

时间限制: 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]);
    }
}
  • 写回答

1条回答 默认 最新

  • a5156520 2023-01-09 10:45
    关注

    应该是比较单词那里错了,根据题目需要忽略大小写,所以可以先备份所有单词,然后把这个备份里的单词全部转为小写再利用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

    评论 编辑记录

报告相同问题?

悬赏问题

  • ¥15 微信小程序协议怎么写
  • ¥15 c语言怎么用printf(“\b \b”)与getch()实现黑框里写入与删除?
  • ¥20 怎么用dlib库的算法识别小麦病虫害
  • ¥15 华为ensp模拟器中S5700交换机在配置过程中老是反复重启
  • ¥15 java写代码遇到问题,求帮助
  • ¥15 uniapp uview http 如何实现统一的请求异常信息提示?
  • ¥15 有了解d3和topogram.js库的吗?有偿请教
  • ¥100 任意维数的K均值聚类
  • ¥15 stamps做sbas-insar,时序沉降图怎么画
  • ¥15 买了个传感器,根据商家发的代码和步骤使用但是代码报错了不会改,有没有人可以看看