C strtok工作,如果我尝试打印值但分段错误和null如果我尝试传递值

时间:2016-10-02 21:47:05

标签: c

void read_entries() {
  int count = 0;
  for (int i = 0; i < top; i++) {
    FILE *fp;
    fp = fopen(File_List[i], "r");
    char buff[1024];

    while (fgets(buff, 1024, fp) != NULL) {
      if (good_data(buff)) {
        count++;
      }

    }

    fclose(fp);
  }
}


int good_data(char* buff) {
      char *ip;
      ip = strtok (buff, " ");
      ip = strtok (NULL, " ");
      ip = strtok (NULL, " ");
      ip = strtok (ip, ":");

      printf("IP below\n");
      printf("%s\n", ip);
      //strcmp(ip, "69.12.26.238");
      return 0;
}

我有这个功能,解析一条线并抓住它的ip。当我执行以下操作时,它的打印完全符合我的预期。但是,如果我尝试将该ip传递给函数,我会遇到分段错误。即使通过在printf行下面有一个函数,printf也会为ip的值打印null。怎么可能?我能做些什么才能使用ip值?

1 个答案:

答案 0 :(得分:1)

strtok返回一个必须立即使用或复制的缓冲区,该缓冲区绑定到第一个初始化缓冲区。

通过在返回它之前制作这样的副本/将其传递给函数来修复它(我添加了更多语法检查BTW):

  char *ip,*ip_copy;
  ip = strtok (buff, " ");
  ip = strtok (NULL, " ");
  if (ip == NULL) return -1;
  ip = strtok (NULL, " ");
  if (ip == NULL) return -1;
  ip = strtok (ip, ":");
  if (ip == NULL) return -1;

  ip_copy = strdup(ip); // now you have a solid copy of the string, that has a global scope.

注意:由于令人惊讶的strtok工作原理(不具有可重入性,具有记忆效应),因此存在许多类似的错误。