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

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

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

读取un.txt文件,每次读取一行。遍历该行字符串,读到空格,则算作一个单词;将该单词与输入的单词比较,应该有函数可以用。

实现思路:
1、从un.txt获取句子
2、输入单词w
3、遍历句子进行比较
简单实现参考如下:

int main(int argc, const char* argv[])
    char w[17] = "apple!"; // 输入的单词
    char juzi[1000] = "This is a apple apple"; // un.txt获取句子
    int i = 0, count = 0;
    int flag = 0;  // 标记是否已经开始记录下标
    int start = 0; // 记录开始截取下标
    int size = 0;  // 要截取的长度
    int len = (int)strlen(juzi);
    // 对输入的单词进行去符号处理;
    char nw[17];
    int j = 0;
    while (w[i] != '\0') {
        char c = w[i];
        if (c != ',' && c != ';' && c != '.' && c != '?' && c != '!' && c != ' ') {
            nw[j] = c;
            j++;
        }
        i++;
    }
    // 遍历句子截取单词进行比较
    for (i = 0; i <= len; i++) {
        char c = juzi[i];
        if (c == ',' || c == ';' || c == '.' || c == '?' || c == '!' || c == ' ' || c == '\0') {

            char *dst = (char *)malloc(size*sizeof(char));
            memcpy(dst, juzi + start, size);
            *(dst + size + 1) = '\0';
            printf("%s %s\n", dst, nw);
            size = 0;
            flag = 0;
            // 使用处理过的单词进行比较
            if (strcmp(dst, nw) == 0) {
                count++;
            }
        } else {
            if (flag == 0) {
                
                start = i;
            }
            flag = 1;
            size++;
        }
    }
    printf("共找到 %d 个\n", count);
    return 0;
}