无法在txt文件中查找特定字符串

时间:2013-11-27 23:09:48

标签: c

这是我的代码:

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!你好!你好?你好,?你好你好

我该如何解决这个问题?

3 个答案:

答案 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;
}