输入一个不超过17个字母的英文单词 w,然后编写一个程序,从un.txt 中读取英文句子,计算并输出句子中 w 的出现次数。w可以包含符号,如“apple!”。将 un.txt 中半角空格分隔的字符串视为一个单词,区分大小写,并区分是否有符号。
例如,当“apple”一词被指定时,“Apple”或“apple”!“不计数”。另外,不计数部分出现在英语单词中的字符串。例如,包含在“gather”中的“the”不计数。
只会读取和输出
求问中间部分应该怎么写,能有步骤解释就最好了,谢谢。

c语言 统计文件中某个单词的出现次数
- 写回答
- 好问题 0 提建议
- 关注问题
- 邀请回答
-
3条回答 默认 最新
- xdspower 2022-07-11 11:52关注
#include <stdio.h> #include <stdlib.h> #include <string.h> int coutX(char * juzi,char * w,int wl){ // 统计一个句子中的单词w数量 int i = 0, count = 0; int flag = 0; // 标记是否已经开始记录下标 int start = 0; // 记录开始截取下标 int end=0; // 记录结束截取下标 int cmpOK=0; // 比较单词完全相同标记 int len = (int)strlen(juzi); int t=0;// 记录截取的实际长度 int j = 0; for (i=0;i<len;i++){ // char c=juzi[i]; if ( c==' ' || c=='\r'|| c== 0x0A|| c=='\n' || c==0x0D || i==len-1){ // 因为题中明确了只有空格为单词分隔,所以只有空格需要跳过,或者句末 if(flag ){ end = i ; if (i==len -1 ) end =len ; // 对行末的特殊处理 if ( wl == end-start ) { // 待测试的单词长度是匹配的,再进行深入处理 cmpOK=1; for(j=0;j<wl;j++){ if (w[j] !=juzi[start+j]){ cmpOK=0; break; } } if (cmpOK) count++; // 深入比较后完全相同,则计数加1 } } start =0; end =0; flag = 0; // 标记还没有开始一个单词 }else if (!flag ) { start =i ; flag=1; } } return count; } int main(int argc, const char* argv[]){ char w[18] ; // 用来接收输入的单词 int wl=0; // 用来记录w中的长度 FILE * fptr;// un.txt 文件操作句柄 char juzi[1024] = {0}; // un.txt获取句子 int count = 0; printf("请输入一个待查的单词:"); scanf("%s",&w); wl=strlen(w); if ((fptr = fopen("un.txt", "r")) == NULL){ printf("Error! 打开文件出错!"); // 文件指针返回 NULL 则退出 exit(1); } while (fgets(juzi, sizeof(juzi), fptr) != NULL) { count=count+ coutX(juzi,w,wl); } fclose(fptr); printf("共找到 %d 个\n", count); }
不过上面的程序在处理多行的换行时,好像有一点问题,在windows下不能正确处理。
本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报