Drop_the_Course
Drop_the_Course
2021-06-21 17:08
采纳率: 33.3%
浏览 179

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

有大佬帮忙看看吗!

  • 点赞
  • 收藏

4条回答 默认 最新

  • Feng_wwf
    NDSC专家-王文峯 2021-06-22 15:16

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

     

    #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;
    }
    
    点赞 评论
  • hubei_dxx
    hubei_dxx 2021-06-22 17:47

    #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;
    }

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

    点赞 评论
  • qfl_sdu
    qfl_sdu 2021-06-22 23:35

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

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

    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;
    }
    
    点赞 评论
  • qq_46523755
    正在学C++ 2021-06-23 20:56

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

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

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

    点赞 评论

相关推荐