C 变量不断重置

C 变量不断重置,c,variables,global,C,Variables,Global,我编写了一段代码,它使用命令行参数在txt文件中搜索指定的单词,然后返回找到该单词的次数。 我试图让它只打印所有文件中找到的单词总数,但目前我只能让它单独打印每个文件中找到单词的次数 正在运行的代码示例是./nameofcode birds test1.txt test2.txt test3.txt 我尝试过一些不同的想法,但似乎都不管用。其想法是让变量final count表示总次数,然后在所有搜索完成后打印它,但它只是在每次搜索后重置或保持在0 #include<stdio.h>

我编写了一段代码,它使用命令行参数在txt文件中搜索指定的单词,然后返回找到该单词的次数。 我试图让它只打印所有文件中找到的单词总数,但目前我只能让它单独打印每个文件中找到单词的次数

正在运行的代码示例是./nameofcode birds test1.txt test2.txt test3.txt

我尝试过一些不同的想法,但似乎都不管用。其想法是让变量final count表示总次数,然后在所有搜索完成后打印它,但它只是在每次搜索后重置或保持在0

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

int main(int argc, char * argv[]) {
  int final = 0;
  int result, errno;
  int i;
  int n;
  char * word = argv[1];
  char * list[200];
  //pid_t pid = fork();

  if (argc < 1) {
    exit(1);
  }
  system("cls");
  for (i = 2; i < argc; i = i + 1) {
    if (fork() == 0) {
      list[i] = argv[i];
      result = Search_in_File(word, list[i]);
      final = final + result;
      if (result == -1) {
        printf("\n Invalid input.");
      } else {
        printf("\n Total matches found: %d\n", result);
      }
      exit(0);
    }

    for (n = 0; n < argc - 1; n++) {
      wait(NULL);
    }

  }

  if (result == -1) {
    perror("Error");
    if (errno == 10) {
      printf("\n Invalid file");
      exit(1);
    } else {
      printf("\n Error number = %d\n", errno);
      exit(1);
    }
    printf("%d\n", final);

  }
  return (0);
}

int Search_in_File(char * str, char * fname) {
  FILE * fp;
  int line_num = 1;
  char temp[200];
  int find_result = 0;
  if ((fp = fopen(fname, "r")) == NULL) {
    return (-1);
  }

  while (fgets(temp, 200, fp) != NULL) {

    if ((strstr(temp, str)) != NULL) {
      find_result++;
      //final++;    
    }
    line_num++;
  }

  if (find_result == 0) {
    printf("\nSorry, couldn't find a match.\n");
  }

  if (fp) {
    fclose(fp);
  }
  return (find_result);
}
#包括
#包括
#包括
#包括
int main(int argc,char*argv[]){
int final=0;
int结果,errno;
int i;
int n;
char*word=argv[1];
字符*列表[200];
//pid_t pid=fork();
如果(argc<1){
出口(1);
}
系统(“cls”);
对于(i=2;i

如果每个文件包含单词birds的3倍,那么预期结果将是9,而不是3或0。

为什么要重新定义
errno
?编译器会允许吗?至于你的问题,你忘记了一个关于进程和
fork
工作原理的非常关键的部分:
fork
创建一个新的独立进程,子进程将独立于父进程运行,最重要的是,它有自己独立的虚拟内存,不同于父进程。父进程和子进程中的变量将不共享。如果要在父进程/子进程之间共享变量,则需要共享内存区域。即使是
static
也无法帮助您:)@KonradRudolph使用本地
errno
变量是未定义的行为。如果没有包含
,我不确定它是否是未定义的行为,但是如果包含
,它肯定是未定义的行为。(7.5p2)。无论如何,
if(errno==10)
无论如何都是未定义的行为,因为本地
errno
变量在该点上尚未初始化或赋值。@KonradRudolph我只是在考虑一些实现将
errno
定义为一个宏,该宏调用一个返回被取消引用的指针的函数。另一方面,根据宏的定义方式,可以将其扩展为有效的函数前向声明。