我试图弄清楚如何计算使用C编程在文本文件中发生特定字符串“test”的次数。我希望程序在完成后显示最终的计数。
这是我提出的代码,但它似乎没有做到这一点。我生成的计数略低于文本文件中实际存在的计数。
有谁看到我做错了什么?我对C编程很新,所以任何见解都会非常感激!
#include<stdio.h>
#include<string.h>
int main()
{
FILE *ptr_file;
char buf[200];
char key[] = "test"; // the string I am searching for
int wordcount = 0;
ptr_file = fopen("input.txt","r"); // my input text file
while (fgets(buf,200, ptr_file)!=NULL)
{
if((strstr(buf,key)) !=NULL){
wordcount++;
}
}
fclose(ptr_file);
printf("%d",wordcount);
}
答案 0 :(得分:1)
strstr
在string.h头文件中定义。如果你不包含string.h,那么strstr
在你的源文件中是未声明的,它会被隐式声明为返回一个int并取出未指定的参数(也就是说它就像声明int strstr()
一样)。当程序的目标文件由于潜在的函数签名不匹配而链接到标准C库时,这可能会出现问题,因此会出现警告。
解决方案很简单:确保包含string.h。
对于一行中多次出现搜索字符串的问题,请注意strstr
man page的说明部分中的第一段:
strstr()函数在字符串 haystack 中查找第一次出现的子字符串 needle 。不比较终止空字节(“\ 0”)。
虽然您可以使用strstr
查找多个子字符串,但您需要循环使用字符串,每次使用不同的起始位置。根据您的起点,它可以匹配以前匹配的字符串部分(例如“testest”将计为2个匹配)或仅匹配不匹配的部分(例如“testest”将计为1)。
如果您希望计算完整单词的出现次数而不仅仅是子字符串,strstr
不是很有用。一种选择是使用strpbrk
或strcspn
来查找单词(即字母)字符,使用strspn
来查找非单词字符。通过这些,您可以找到单词的第一个字符,与搜索字符串进行比较,如果匹配,则测试下一个字符不是字母。如果不是,则递增计数;如果是,请转到下一个单词。或者,您可以遍历每个字符并使用isalpha
来区分字母和非字母(因此,单词的开头和结尾)。
另一种选择是将输入分成单词列表,然后扫描单词列表中的搜索单词。 String tokenizing函数会执行此操作,但它们会更改您传入的缓冲区。您还可以使用fscanf
一次从文件中读取一个单词。这具有正确处理长线的附加优点。
答案 1 :(得分:1)
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int wc(char* file_path, char* word){
FILE *fp;
int count = 0;
int ch, len;
if(NULL==(fp=fopen(file_path, "r")))
return -1;
len = strlen(word);
for(;;){
int i;
if(EOF==(ch=fgetc(fp))) break;
if((char)ch != *word) continue;
for(i=1;i<len;++i){
if(EOF==(ch = fgetc(fp))) goto end;
if((char)ch != word[i]){
fseek(fp, 1-i, SEEK_CUR);
goto next;
}
}
++count;
next: ;
}
end:
fclose(fp);
return count;
}
int main(){//testestest : count 2
char key[] = "test"; // the string I am searching for
int wordcount = 0;
wordcount = wc("input.txt", key);
printf("%d",wordcount);
return 0;
}