将字符串时间戳 HH:MM:SS 转换为 C 中的整数

Posted

技术标签:

【中文标题】将字符串时间戳 HH:MM:SS 转换为 C 中的整数【英文标题】:Converting a string timestamp HH:MM:SS to an integer in C 【发布时间】:2014-03-11 02:05:25 【问题描述】:

请原谅我的幼稚,我只是第一次学习 C。基本上我有一系列字符串,其中包含格式为“HH:MM:SS”的时间戳。我正在寻找一个形式为 int tsconvert(char *) 的函数,它可以将时间戳转换为整数。这是我到目前为止写的一些代码

int tsconvert(char *timestamp)

    int x;
    removeColon(timestamp,8);
    x = atoi(timestamp);
    return x; 


void removeColon(char *str1, int len)    

    int j = 0;
    for (int i = 0; i < len; i++)
    
        if (str1[i] == ':')
        
            continue;
        

        else
        
            str1[j] = str1[i];
            j++;
        
    

    str1[j] = '\0';

当我尝试使用此代码时,我得到一个分段错误。我的编程课上有人建议我简单地从时间戳中提取数字并将它们放在一个新字符串中,但我不知道该怎么做。

【问题讨论】:

你怎么称呼这个tsconvert() @leeduhem 这是我的完整程序,由于第 115 行 link 中的调用而发生分段错误。 我打不开你的链接,可能是被GFW屏蔽了。 @leeduhem 哈哈抱歉试试这个pastebin.com/n5nFjHkL 还是没有运气。可能整个网站都被屏蔽了。 【参考方案1】:

要从时间戳 (HH:MM:SS) 中提取数字,只需使用 sscanf():

const char *str = "01:02:03";
int h, m, s;
sscanf(str, "%d:%d:%d", &h, &m, &s);
printf ("%d, %d, %d\n", h, m, s);

【讨论】:

你的函数工作得很好,但是当我尝试在我的程序中使用它时,我仍然遇到分段错误。【参考方案2】:

我的建议与@Younggun Kim 没有太大区别,但建议进行额外的错误检查。

使用"%n" 确定扫描是否完成到字符串末尾且没有额外的垃圾。

// -1 error else 0 - 86399
long tsconvert(const char *timestam) 
  unsigned h, m, s;
  int n = 0;
  int cnt = sscanf(timestam, "%2u:%2u:%2u %n", &h, &m, &s, &n);
  if (cnt != 3 || timestam[n] != '\0') return -1 ; // Format Error;
  if (h >= 24 || m >= 60 || s >= 60) return -1; // Range Error
  // 0 - 86400-1
  return ((h*60 + m)*60L + s;

【讨论】:

以上是关于将字符串时间戳 HH:MM:SS 转换为 C 中的整数的主要内容,如果未能解决你的问题,请参考以下文章

如何在进行选择查询时将 YYYY-MM-DD HH:mm:ss 中的时间戳转换为 Hive 中的 YYYY-MM-DD HH:mm:ss.SSS?

Oracle 中的时间戳转换为 YYYY-MM-DD HH:MM:SS 格式

将小时:分钟:秒(HH:MM:SS)字符串转换为适当的时间类

跪求啊 时间戳在jsp页面上怎么转换为yyyy-MM-dd HH:mm:ss

如何将整数(时间)转换为 HH:MM:SS::00 正在进行 SQL

将时间戳(字符串)转换为毫秒(长)