这是我的代码:
int findKey(char *in, char *key, int buf){
int count = 0;
FILE *f;
f = fopen(in,"r");
char temp[buf];
while(fgets(temp,buf,f) != NULL){
char *p = temp;
while((p=(strstr(p,key)))!=NULL){
count++;
++p;
}
int i = 0;
}
fclose(f);
return count;
}
所以char *in
是一个txt文件,key是我在txt文件中寻找的单词。例如,txt文件可能是
hello Hello hello helloworld worldhello !hello! hello? hello, ?hello hello
如果关键字是“hello”,那么count应该返回2.但是在这种情况下,它返回9,因为它也将它们视为有效:
helloworld worldhello !hello! hello? hello, ?hello
何时只应将粗体计为有效
你好你好你好 helloworld worldhello!你好!你好?你好,?你好你好
我该如何解决这个问题?
答案 0 :(得分:0)
这个新例程可以工作,并且可以扩展为支持除" \n\r\t"
(所有空格字符)之外的其他类型的分隔符。请小心,因为它使用动态分配但绝对100%可移植。
int count = 0;
FILE *f = fopen (in, "r");
char *tmp = calloc (1, 1);
int len = 0;
while (! feof (f)) {
tmp = realloc (tmp, len + buf);
fgets (&tmp[len], buf, f);
len += buf;
}
fclose (f);
strtok (tmp, "");
char *p;
while ((p = strtok (NULL, " \n\r\t")) != NULL)
if (strcmp (p, key) == 0)
count += 1;
free (tmp);
return count;
答案 1 :(得分:0)
scanf()
解决方案:
测试字符串和/或键都保持不变。 (const
)。
void findKey(void) {
const char *in =
"hello Hello hello helloworld worldhello !hello! hello? hello, ?hello hello";
const char *key = "hello";
int count = 0;
char temp[strlen(in) + 1];
const char *p = in;
while (*p) {
int n;
if (1 != sscanf(p, " %s%n", temp, &n)) {
break;
}
if (0 == strcmp(key, temp)) {
count++;
}
p = &p[n];
}
printf("%d\n", count);
}
答案 2 :(得分:0)
使用memcmp()
和isspace()
的简单解决方案:
不需要临时缓冲区
unsigned findKey(const char *in, const char *key) {
unsigned count = 0;
size_t keyLen = strlen(key);
int Ready = 1;
while (*in) {
while (isspace((unsigned char) *in)) { in++; Ready = 1; }
if (Ready) {
if (memcmp(in, key, keyLen) == 0 &&
(isspace((unsigned char) in[keyLen]) || (in[keyLen] == '\0'))) {
count++;
}
Ready = 0;
}
in++;
}
return count;
}