我写了个想做到题目效果的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