#include <stdio.h>
#include <stdlib.h>
#include <string.h>


int c;

char* lib[5] = { "auto", "break", "char", "case", "const" };
char str[1000];
char buffer[300];
FILE *fp;

int main(){

    c = 0;

    fp = fopen("filename.txt", "r");

    if (fp == NULL){
        perror("Error in reading file");
    }

    if (fp != NULL){
        for (int j = 0; j < 5; j++){
            while (fgets(str, sizeof(buffer), fp) != NULL){
                if (strstr(str, lib[j]) != NULL) {
                    c++;
                }
            }
        }
        printf("%d", c);
    }
    while (1){};
}

所以我试图计算文本文件中的关键字数量。代码不会编译,并声明问题位于for循环和strstr参数周围。在之前的一次尝试中,它会编译,但不会计算关键字的数量,它只打印了0。我有什么办法可以解决这个问题,使代码编译或另一个简单的方法来计数文本文件中的关键字数量。
代码片段将非常有用。

最佳答案

你的主要问题是(在你编辑它之前)你有你的输入循环的正确嵌套和你的搜索循环颠倒。
另外,正如目前所写的,您并没有真正计算文件中lib中单词的实例总数,因为您没有正确处理同一字符串(例如-“char”)多次出现在给定行/输入上的情况。
下面是另一个版本:

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <ctype.h>

int main(int argc, char **argv)
{
  const char *lib[5] = { "auto", "break", "char", "case", "const" };
  char       *str    = NULL;
  size_t      cap    = 0;
  int         c      = 0;
  const char *srch;
  FILE       *fp;
  int         i, j;

  for (i = 1; i < argc; ++i, c = 0)
  {
    if (NULL == (fp = fopen(argv[i], "r"))) {
      perror(argv[i]);
      continue;
    }

    while (-1 != getline(&str, &cap, fp))
      for (j = 0, srch = str; j < 5; ++j, srch = str)
        while (NULL != (srch = strstr(srch, lib[j])))
        {
          const char *next_srch = srch + strlen(lib[j]);

          if ((srch == str || !isalnum(srch[-1])) && // ensure prev char not alphanumeric
              !isalnum(next_srch[0]))                // ensure next char not alphanumeric
            ++c;

          srch = next_srch;
        }

    fclose(fp);
    printf("%s: %d\n", argv[i], c);
  }

  if (str)
    free(str);

  return 0;
}

关于c - 计算C中文本文件中的关键字,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28887130/

10-14 22:57