m0_71469623 2022-07-10 20:30 采纳率: 89.5%
浏览 224
已结题

c语言 统计文件中某个单词的出现次数

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

  • 写回答

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下不能正确处理。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 7月19日
  • 已采纳回答 7月11日
  • 修改了问题 7月11日
  • 修改了问题 7月11日
  • 展开全部

悬赏问题

  • ¥66 定制开发肯德基自动化网站下单软件
  • ¥20 vscode虚拟环境依赖包未安装
  • ¥15 odoo17关于owl开发js代码问题
  • ¥15 光纤中多普勒频移公式的推导
  • ¥15 怎么制作一个人脸识别门禁系统
  • ¥20 大华dss监控平台网络关闭登不进去
  • ¥15 请使用蚁群算法解决下列问题,并给出我完整的代码
  • ¥20 关于php录入完成后,批量更新数据库
  • ¥15 请教往复密封润滑问题
  • ¥15 cocos creator发布ios包