变位词实现 编程珠玑一处错误

本文分享了一段C语言代码,用于实现单词内部字符的排序并标记,通过两次排序和文件读写操作,最终输出排序后的单词及其原始形式。代码首先读取输入文件中的单词,对每个单词进行内部字符排序,然后比较排序后的单词,去除重复项,并将结果写入输出文件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

书中只实现了单词内部的排序而求得标记词,而并未实现单词之间的排序,所以运行结果按不符合作者预期结果,可能是作者的一个疏忽。

完善后代码如下:

#include <stdio.h>
#include <string.h>
#define WORD_MAX_LENGTH 100
#define DICT_NUM 100

char word[DICT_NUM][WORD_MAX_LENGTH], word_sign[DICT_NUM][WORD_MAX_LENGTH], old_word_sign[WORD_MAX_LENGTH];
int count = 0;

int char_cmp(char *x, char *y)
{
return *x - *y;
}

int str_compare(char *x, char *y )
{
return strcmp(x,y);
}

int sign_and_sort(char *input_file_name, char *output_file_name)
{
FILE *fp_input, *fp_output;
int i = 0;
if ((fp_input = fopen(input_file_name, "r")) == NULL || (fp_output = fopen(output_file_name, "w")) == NULL)
{
printf("cannot access the file!");
exit(0);
}

while (fscanf(fp_input, "%s", word[count]) != EOF)
{
strcpy(word_sign[count], word[count]);
qsort(word_sign[count], strlen(word_sign[count]),sizeof(char), char_cmp);
strcat(word_sign[count], ": ");
strcat(word_sign[count], word[count]);
count++;
}

qsort(word_sign, count,sizeof(word_sign[count]), str_compare);
for (i = 0;i < count; i++)
fprintf(fp_output,"%s\n", word_sign[i]);

fclose(fp_input);
fclose(fp_output);
return 0;
}

int squash(char *input_file_name, char *output_file_name)
{
FILE *fp_input, *fp_output;
int linenumber = 0;
count = 0;
strcpy(old_word_sign, "");
if ((fp_input = fopen(input_file_name, "r")) == NULL || (fp_output = fopen(output_file_name, "w")) == NULL)
{
printf("cannot access the file!");
exit(0);
}

while (fscanf(fp_input, "%s %s", word_sign[count], word[count]) != EOF)
{
if (strcmp(old_word_sign, word_sign[count]) != 0 && linenumber > 0)
fprintf(fp_output, "\n");
strcpy(old_word_sign, word_sign[count]);
linenumber++;
fprintf(fp_output, "%s ", word[count++]);
}

fclose(fp_input);
fclose(fp_output);
return 0;
}

int main()
{
sign_and_sort("dict.txt", "mid.txt");
squash("mid.txt", "result.txt");
return 0;
}

运行过程及结果:



转载于:https://www.cnblogs.com/seebro/archive/2012/03/01/2375644.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值