时间限制: 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