【问题描述】 编写一个程序,从一个文件中读入单词(即:以空格或回车换行分隔的字符串),并对单词进行排序,删除重复出现的单词,然后将结果输出到另一个文件中。 【输入形式】 源文件名和目标文件名在执行时作为程序命令行参数输入,例如若程序名为sort, 源文件名和目标文件名分别为sort.in和sort.out,则命令行为:sort sort.in sort.out。 程序将从当前目录下sort.in文件中读入单词。 【输出形式】 对单词进行排序,删除重复出现的单词,然后将结果输出到文件sort.out中。 【输入样例】 假如sort.in文件内容如下: rrr sss aaa bbb ccc ddf aaa dd 【输出样例】 sort.out文件内容为: aaa bbb ccc dd ddf rrr sss
时间: 2024-03-10 10:51:14 浏览: 158
以下是代码实现:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_WORD_LEN 100 // 定义单词的最大长度
int main(int argc, char *argv[]) {
FILE *fp_in, *fp_out;
char word[MAX_WORD_LEN + 1]; // 定义一个字符数组来存放单词
char *words[1000]; // 定义一个指针数组来存放所有单词的地址
int word_count = 0;
if (argc < 3) {
printf("Usage: %s source_file target_file\n", argv[0]);
exit(1);
}
fp_in = fopen(argv[1], "r");
fp_out = fopen(argv[2], "w");
// 读入所有单词
while (fscanf(fp_in, "%s", word) != EOF) {
int i, j;
// 判断单词是否已存在于数组中
for (i = 0; i < word_count; i++) {
if (strcmp(words[i], word) == 0) {
break;
}
}
// 如果不存在,则将其存入数组中
if (i == word_count) {
words[word_count] = (char *) malloc(strlen(word) + 1);
strcpy(words[word_count], word);
word_count++;
}
}
// 对单词进行排序
for (int i = 0; i < word_count - 1; i++) {
for (int j = i + 1; j < word_count; j++) {
if (strcmp(words[i], words[j]) > 0) {
char *temp = words[i];
words[i] = words[j];
words[j] = temp;
}
}
}
// 将排序后的单词写入输出文件
for (int i = 0; i < word_count; i++) {
fprintf(fp_out, "%s ", words[i]);
free(words[i]); // 释放存储单词的内存空间
}
fprintf(fp_out, "\n");
fclose(fp_in);
fclose(fp_out);
return 0;
}
```
该程序使用了指针数组来存储所有的单词,并使用 `malloc` 分配内存空间,最后使用 `free` 释放内存空间。首先通过命令行参数获取源文件名和目标文件名,并打开文件进行读写操作。然后逐个单词读入源文件,判断该单词是否已存在于指针数组中,如果不存在,则将其存入数组中。最后对数组中的单词进行排序,并将排序后的单词写入目标文件中。最后关闭输入文件和输出文件,完成程序的执行。
阅读全文
相关推荐














