C - 将子字符串转换为 int

标签 c type-conversion

目前我在 C 中得到了这个简单的代码,只将天、分钟和秒转换为秒:

已编辑(我理解 atoi 的问题,就像这样更正了吗?):

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

int getseconds(char * time)
{
    int seconds=0, i=0;
    char buffer[3];
    while (*time != '\0')
    {
        switch (*time)
        {
            case 'h': buffer[i]='\0';i=0;seconds=seconds+atoi(buffer)*3600;break;
            case 'm': buffer[i]='\0';i=0;seconds=seconds+atoi(buffer)*60;break;
            case 's': buffer[i]='\0';i=0;seconds=seconds+atoi(buffer);break;
            case ' ':break;
            default: buffer[i]=*time;i++;break;
        }
        time++;
    }
    return seconds;
}

int main()
{

    char *time = "12h  4m 58s";
    int seconds = getseconds(time);
    printf("%d",seconds);
    return 0;
}

这是我想要的,但没有另一种方法可以做到这一点,而不创建更多变量(比如 C#,我只需要转换“内联”。C 是否只有转换为变量的函数而不是转换为变量的函数? “内联”)?

C# 示例:

        string time = "12h 34m 58s";
        int seconds = int.Parse(time.Substring(0, 2)) * 3600 + int.Parse(time.Substring(4, 2)) * 60 + int.Parse(time.Substring(8, 2));

我猜你可以发现行数差异:)。

最佳答案

您可以使用 atoi()strtol() 来完成这项工作。您不需要先提取子字符串,因为这些函数会在无法转换的第一个字符处停止。您只需要从不同的角度看待字符串的起始位置。因此,此代码非常类似于您的 C# 示例:

int getseconds(const char * time) {
    return atoi(time) * 3600 + atoi(time + 4) * 60 + atoi(time + 8);
}

当然它会在一些格式错误的输入上中断,但 C# 也会如此(尽管不是所有相同输入)。

关于C - 将子字符串转换为 int,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34054555/

相关文章:

c++ - 将不等于 0 的整数减为 1

将赋值表达式编译为字节码

Java:处理时间表达式

c++ - 为什么不能隐式转换模板类型参数?

php - 如何将字符串转换为整数并进行测试?

c - 链接列表有一个指向所需数据的指针

c - Libav(ffmpeg)容器编解码器时基和流时基的目的是什么?

c++ - 在C++中以C方式初始化结构

mysql - 将 MySQL "INSERT"命令转换为文本

指向字节结构成员的 C 字指针