用sscanf解析字符串

时间:2018-10-04 21:27:36

标签: c

我有如下访问日志:

[Thu Oct  4 00:20:05.140 2018] 0.017 sec 0.017 sec [ext2/0/rel 53798 (0,10)] [question_description] @products_description"find ea"/1

我需要阅读日期时间[2018年10月4日星期四00:20:05.140]和“ find ea”之间的字符串。

我的代码:

int main(void) {
  char buffer[10000];
  int count = 0;
  char datetime[35];
  FILE* fptr;
  fptr = fopen("query.log", "r");
  while (count < 10) {
    if (!fgets(buffer, sizeof buffer, fptr)) break;

    sscanf(buffer,"%[^\n]", datetime);
    printf("date : %s", datetime);

    count++;
    printf("\n");
  }
  return 0;
}

我需要更新sscanf的表达式,以便获取日期时间和字符串“ xxxx”

1 个答案:

答案 0 :(得分:1)

您可以使用strtok获取所需的字符串,这是我的解决方案:

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

int main()
 {
  char * tok;
  char buffer[10000];
  int count = 0;
  char datetime[35];
  char qdescription[35];
  char pdescription[35];
  FILE* fptr;

  if(!(fptr = fopen("query.log", "r")))
  {
    perror("No file\n");
    fclose(fptr);
    return -1;
  }

while(fgets(buffer, sizeof(buffer), fptr))
{
  for(tok = strtok(buffer, "[]"); tok != NULL; tok = strtok(NULL, "[]"), count++)
  {
    switch(count)
    {
      case 0: strcpy(datetime, tok);

      case 4: strcpy(qdescription, tok);

      case 5: strcpy(pdescription, tok);
    } 
  }
}

printf("%s\n%s\n%s\n", datetime, qdescription, pdescription);

  return 0;
}

使用此代码,您可以检索日期和question_description,但我无法隔离出最后一个product_description,看看是否可以找到解决此问题的方法。