目前我在 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/