c语言编写程序在一给定的文件中查找单词,输出单词在各行出现的次数。待查找的单词不超过10个,每个单词的字符数也不超过10。文件中每行字符数不超过100。注意: 1. 单词中除了字母、数字外有可能包含其它字符,但不包含空格符; 2. 单词大小写查找相关; 3. 不考虑单词重叠查找,例如:待查找单词为"aa",假如文件第一行为"the word aaaaaa",则单词"aa"在第一行出现了三次。 【输入形式】 假设要处理的文件保存在当前目录下,文件名为:in.c。 待查找的单词从控制台输入,各单词间以一个空格分隔,最后一个单词后有回车换行。 【输出形式】 将单词出现的次数输出到当前目录下的found.txt文件中,每个单词独占一行:先输出单词,后跟冒号":",最后是出现的次数。每行出现次数用"行号,在该行出现次数"表示,若在多行出现,则次数之间用";"分隔,最后一个出现次数后也带分号。若查找不到单词,则只输出单词和冒号。
时间: 2024-02-12 10:05:54 浏览: 69
好的,下面是代码实现,注释在代码中已经给出:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#define MAX_WORD 10 // 最大单词数
#define MAX_LEN 10 // 单词最大长度
#define MAX_LINE 100 // 每行最大字符数
void search_word(char* word, FILE* fp, FILE* fp_out);
// 查找单词函数,参数为单词、文件指针和输出文件指针
int main()
{
char words[MAX_WORD][MAX_LEN + 1]; // 存储待查找的单词
int num_word = 0; // 待查找的单词数
char c;
int i = 0, j = 0;
FILE* fp_in, * fp_out;
// 打开输入文件
fp_in = fopen("in.c", "r");
if (fp_in == NULL) {
printf("Open file failed!\n");
return 0;
}
// 打开输出文件
fp_out = fopen("found.txt", "w");
if (fp_out == NULL) {
printf("Create file failed!\n");
return 0;
}
// 读取待查找的单词,存入words数组中
while ((c = getchar()) != '\n') {
if (c == ' ') {
words[num_word][j] = '\0'; // 单词结束
num_word++; // 单词数+1
j = 0; // 下一个单词的第一个字符
}
else {
words[num_word][j++] = c; // 存入单词
}
}
words[num_word][j] = '\0'; // 最后一个单词结束
num_word++; // 最后一个单词也算上
// 逐行查找单词
while (!feof(fp_in)) {
char line[MAX_LINE + 1];
fgets(line, MAX_LINE + 1, fp_in); // 读取一行
for (i = 0; i < num_word; i++) {
search_word(words[i], fp_in, fp_out); // 查找单词
}
}
// 关闭文件
fclose(fp_in);
fclose(fp_out);
printf("Search completed!\n");
return 0;
}
void search_word(char* word, FILE* fp, FILE* fp_out)
{
char line[MAX_LINE + 1];
int line_num = 0;
int cnt = 0;
char* p;
// 查找单词
while (!feof(fp)) {
line_num++;
fgets(line, MAX_LINE + 1, fp); // 读取一行
p = line;
while ((p = strstr(p, word)) != NULL) { // 在一行中查找单词
if ((p == line || !isalnum(*(p - 1)))) { // 判断单词前面是否为字母或数字
p += strlen(word);
if (*p == '\0' || !isalnum(*p)) { // 判断单词后面是否为字母或数字
cnt++; // 单词出现次数+1
}
}
else {
p += strlen(word);
}
}
if (cnt > 0) {
// 输出单词和出现次数
fprintf(fp_out, "%s:", word);
fprintf(fp_out, "%d,%d", line_num, cnt);
cnt = 0;
// 在其他行中继续查找单词
while (!feof(fp)) {
fgets(line, MAX_LINE + 1, fp);
line_num++;
p = line;
while ((p = strstr(p, word)) != NULL) {
if ((p == line || !isalnum(*(p - 1)))) {
p += strlen(word);
if (*p == '\0' || !isalnum(*p)) {
cnt++;
}
}
else {
p += strlen(word);
}
}
if (cnt > 0) {
fprintf(fp_out, ";%d,%d", line_num, cnt);
cnt = 0;
}
}
fprintf(fp_out, ";\n");
break;
}
}
if (cnt == 0) {
// 未找到单词,输出单词和冒号
fprintf(fp_out, "%s:\n", word);
}
}
```
需要注意的是,本程序在处理单词时,将非字母或数字的字符视为单词的分隔符。如果要处理其他情况,需要对代码进行相应修改。
阅读全文