C89 - 从字符串中提取时间

标签 c string time format

我遇到一个问题,我需要从日志文件中读取行,检查该行是否包含单词“fail”,如果包含,则输出从午夜到错误发生的时间经过了多少秒。

日志文件中的示例行如下所示:

Aug 20 10:20:57 kernel: ata3: SATA link down

问题的前两部分工作正常(从日志文件中读取行并检查它们是否包含“失败”一词),但我对如何从日志文件中提取时间并将其转换感到有点困惑从午夜开始已经过去了几秒。

到目前为止我所拥有的看起来像这样(代码的相关部分):

do
{
    currLine = fgets(buff, sizeof(buff), inFile);

    if(strstr(currLine, "fail") != NULL)
    {
        /*convert the time into seconds since midnight and output it*/
    }
} while(!feof(inFile));

到目前为止,我只能想出一个如何实现它的想法,但它不起作用(这将在上面的 if 语句中,我在其中放置了占位符注释来解释它需要什么做):

int hr, min, sec, timePassed;           
fscanf(currLine, "%d:%d:%d", &hr, &min, &sec);
timePassed = hr * 3600 + min * 60 + sec;

提前非常感谢

最佳答案

您的示例因两个原因而不起作用。首先,您使用的是fscanf 而不是 sscanf (文件和字符串)第二:你没有跳转到 数字。您的扫描从字符串的开头开始,其中包含 没有号码,所以不会匹配。一个简单的技巧可以让这项工作成功,如果 月份和日期部分的大小恒定,类似于:

sscanf(currLine+7, "%d:%d:%d", &hr, &min, &sec);

“官方”且更安全的方法是使用 strptime,如果您 实现使其可用。

#include <time.h>

struct tm time;

/* ... */

strptime(currLine, "%b %d %H:%M:%S", &time);

现在您拥有了 time 结构,并且可以提取您需要的组件。

timePassed = time.tm_hour * 3600 + time.tm_min * 60 + time.tm_sec;
<小时/>

警告:正如评论中所述,请检查您的使用情况 while(!feof(inFile)).

关于C89 - 从字符串中提取时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32994774/

相关文章:

python - 如何将 python 中的时间戳格式化为可读格式?

java - 自定义字符串格式的时间(以秒为单位)

c - 如何将数据从数组发送到指针变量并从指针变量返回到数组?

c# - 无法将 C# 字符串从用户态传递到内核模式 C 并使用它来查找特定的 LDR_DATA_TABLE_ENTRY

C作业——编译代码时发现木马

MySQL函数按字母顺序对字符串进行排序

javascript - 如何将字符串中每个单词的第一个字母大写?

c++ - 如何保证在运行时解密的文件被清理干净?

c# - 如何将字符串拆分为 double 并将它们添加到数组 C#

PHP将mysql查询字符串转换为mm :ss time format