从字符串中提取子字符串(使用字符串库从C中的ping回复开始的时间)

时间:2014-12-12 14:03:25

标签: c ping

只是想获得时间价值。看C库表没有直接的答案。

64 bytes from 58.27.61.104: icmp_seq=3 ttl=59 time=45.5 ms

1 个答案:

答案 0 :(得分:0)

使用标准string.h函数strstr在字符串中查找子字符串。当找到时,返回指向所定位子字符串的第一个字符的指针。添加子字符串长度,使其指向紧跟在该子字符串后面的字符。

然后使用strtod将ASCII字符串转换为double值。 strtod忽略前导空格并将使用当前区域设置:

  

..在字符串中引出空白字符        (由isspace(3)函数定义)被跳过。小数点        字符在程序的区域设置中定义(类别LC_NUMERIC)   (来自OS X上的man strtod

一个健壮的程序应检查无效输入(即,time=后面没有数字,或者double中无法表示该值),但为清楚起见,此处省略了错误检查。

在代码中:

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

int main (void)
{
    char *input = "64 bytes from 58.27.61.104: icmp_seq=3 ttl=59 time=45.5 ms";
    char *looking_for = "time=";
    char *pos_of_time;
    double the_time;

    pos_of_time = strstr (input, looking_for);
    if (pos_of_time == NULL)
    {
        printf ("No match for 'time=' found\n");
    } else
    {
        /* pos_of_time points to the 't' */
        /* we need to look beyond the string */
        pos_of_time += strlen(looking_for);
        the_time = strtod (pos_of_time, NULL);
        printf ("time is %f\n", the_time);
    }

    return 0;
}

显示预期的输出:

time is 45.500000