C语言查看txt文本中某个单词出现了多少次

我写了个想做到题目效果的main,但是他就是检测不到txt文本里的第一个单词的前三个好像

想问一下是哪里弄错了捏?

 

int main(int argc, char* argv[])
{
    // check that the user passes in the name of a file
    if(argc != 3){
        printf("Error: please pass in two string, e.g.:\n");
        printf("./t4 str1 str2\n");
        return -1;
    }
    
    int len1=strlen(argv[1]);
    int len2=strlen(argv[2]);

    char str1[100];
    char str2[100];

    str1[0] ='\0';
    str2[0] ='\0';

    int count1 = 0;
    int count2 = 0;
    
    char last1 = getchar();
    char last2 = getchar();
    while(last2 != EOF){
        char current = getchar();
        
        int slen1 = strlen(str1);
        if(slen1 < len1) {                            //check if slen1 == len1
            str1[slen1] = current;                 //if not, add "current" to
            str1[slen1+1] = '\0';                   //str1 
        }
        else if(slen1 == len1){
            for (int i = 0; i < len1-1; i++)         //Change the letter in str1
                str1[i] = str1[i+1];                     //so that it matches argv[1] 
            str1[len1-1] = current;
            
            if (strcmp(str1,argv[1]) == 0)            //if str1 == argv[1].
                count1++;                                    //count1++
        }
        last1 = current;
        
        int slen2 = strlen(str2);
        if(slen2 < len2) {
            str2[slen2] = current;
            str2[slen2+1] = '\0';
        }
        else if(slen2 == len2){
            for (int i = 0; i < len2-1; i++)
                str2[i] = str2[i+1];
            str2[len2-1] = current;
            
            if (strcmp(str2,argv[2]) == 0) 
                count2++;  
        }
        last2 = current;
        
        
    }

        
    printf("%s : %d\n", argv[1], count1);
    printf("%s : %d\n", argv[2], count2);
    
    return 0;
}

这就是所有代码了,我的txt里就有四行名字:

paul
ringo
george
john

比如输入 r 就会输出 r : 2 这样的,但是我输入pa 或者paul 或者ul的时候,他都返回0 QAQ

有大佬帮忙看看吗!

代码如下:如有帮助,请采纳一下,谢谢!

 

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

typedef struct{
	char str[50]; //单词最大长度设为50
	int cnt;//单词出现次数
}Str;

int main() {
	char tmp[50]; 
	FILE *fp;
	Str words[200]; //单词数量上限 
	int num=0;//实际单词数量 
	int i,j,neww=1;//neww标志位,判断是否为新单词 

	fp = fopen("0422.txt", "r");
	//fscanf从文件中获取单个字符串 
	while ( fscanf(fp,"%s",tmp)!=EOF ) {
		neww=1;
		for (i=0; i<num; i++) {
			//重复的单词 
			if ( strcmp(tmp, words[i].str)==0 ) {
				neww=0;
				words[i].cnt++;
			}
		}
		if (neww){
			// 复制字符串
			for (j=0; tmp[j]!='\0'; j++) {
				words[num].str[j] = tmp[j];
			}
			//单词末尾添加结束符 
			words[num].str[j] = '\0';
			// 新单词数量+1 
			words[num++].cnt = 1;
		}
	}
	printf("一共%d个不同的单词,每个单词出现次数如下:\n",num);
	for (i=num-1; i>=0; i--) {
		printf("%-10s %2d\n", words[i].str, words[i].cnt);
	}
	fclose(fp);
	return 0;
}

 

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char txt[] = "paul\nringo\ngeorge\njohn\n";
char* FindTxt(const char* txt, const char* dst)
{
    int  size = strlen(txt);
    char *pTmp=new char[size+1];
    char *p = NULL;
    int count = 0;

    strcpy(pTmp, txt);
    p = strstr(pTmp, dst);
    while(p != NULL && *p != '\0')
    {
        count++;
        p = strstr(p+1, dst);
    }
    delete [] pTmp;
    printf("find %s times:%d\n", dst, count);
    return (char*)txt;
}
int main(int argc, char* argv[])
{
    FindTxt(txt,"r");
    FindTxt(txt,"pa");
    FindTxt(txt,"paul");
    FindTxt(txt,"ul");

	return 0;
}

代码结构有所不同,但是满足问题要求,希望有所帮助

你的代码不全,也没看见读文件的地方,我重新写了一个,代码及效果图如下,如有帮助,请采纳一下,谢谢。

需要输入四个参数,输入的四个参数分别为:

argv[0]=程序名 

argv[1]=读取的文件名 

argv[2]=需要查找的字符串1

argv[3]=需要查找的字符串2

效果图:

代码:

#include <stdio.h>
#include <string.h>
#include <ctype.h>
//查找big中出现smal的次数
void findstr(char*big ,char* smal,int pos[],int *nmb)
{
	int i,j,lenb,lens;
	lenb = strlen(big);
	lens = strlen(smal);
	*nmb = 0;
	if(lens > lenb)
		return;

	i = 0;
	while(i < lenb-lens+1)
	{
		for (j = 0; j < lens;j++)
		{
			if(tolower(big[i+j]) != tolower(smal[j])) //不区分大小写,如果区分大小写,则去掉tolower
				break;
		}
		if (j == lens) //说明找到
		{
			pos[*nmb] = i;
			(*nmb)++;
			i += lens;
		}else
			i++;
	}
}

int main(int argc,char* argv[])
{
	int i = 0;
	FILE* fp;
	char buf[100]={0}; //缓存数据
	int pos[100];
	int total1 = 0,total2 = 0;
	int tmp = 0;
	if (argc != 4)
	{
		printf("需要输入4个参数!!\n");
		return 0;
	}
	printf("参数为:\n");
	printf("argv[0]=%s\n",argv[0]);
	printf("argv[1]=%s\n",argv[1]);
	printf("argv[2]=%s\n",argv[2]);
	printf("argv[3]=%s\n",argv[3]);
	if (!(fp= fopen(argv[1],"r")))
	{
		printf("文件打开失败\n");
		return 0;
	}
	printf("开始读文件...\n");
	while(!feof(fp))
	{
		memset(buf,0,100);
		fgets(buf,100,fp);
		
		i++;
		tmp = 0;
		findstr(buf,argv[2],pos,&tmp);
		printf("第%d行出现%s的次数:%d,",i,argv[2],tmp);
		total1 += tmp;
		tmp = 0;
		findstr(buf,argv[3],pos,&tmp);
		printf("出现%s的次数:%d\n",argv[3],tmp);
		total2 += tmp;
	}
	fclose(fp);
	printf("%s出现的次数:%d\n",argv[2],total1);
	printf("%s出现的次数:%d\n",argv[3],total2);
	return 0;
}

 

我觉得不是代码的问题而是txt文件的问题。txt文件创建的时候会默认带一个BOM头。

BOM是用来判断文本文件是哪一种Unicode编码的标记,其本身是一个Unicode字符,位于文本文件头部。但是我们无法在文本文件中看到它。随着你的文本编码的不同,它的字节长度也会变。如果我们读取该文本文件,就会导致把这个BOM头读入从而出错。我之前也有过你这种问题,文本文件的开头几个字符一直读入错误。

解决办法:用类似notepad++打开文件,编码格式中选择无BOM头的UTF8编码;或者编译器比如我使用的CLion右键点击该文件选择Remove BOM