语言C格式化的字符串没有printf

时间:2013-03-26 23:40:29

标签: c string

这就是我想要的:

char *getHour(){
return ("%d:%d:%d",hour, min, sec);
}

返回一个像这样的字符串“hh:mm:ss” 我怎么能这样做?

3 个答案:

答案 0 :(得分:1)

一种可能的实施方式如下所示

编辑:将Dave的建议纳入static数组,snprintf并返回const char *

int hh = 5, mm = 45, ss = 20;

const char* getHour()
{
    static char hourStr[32];
    snprintf(hourStr,14, "%d:%d:%d\n", hh, mm, ss);
    return hourStr;
}

如果您将此实现的输出打印为printf("GetHour: %s\n", getHour());,您将得到GetHour: 5:45:20,我认为这是您的预期输出。

答案 1 :(得分:1)

我会假装你有充分的理由这样做。这是您正在寻找的代码:

char *getHourMinuteSecond( int hour, int minute, int second ) {
    assert( hour >= 0 && hour < 24 );
    assert( minute >= 0 && minute < 60 );
    assert( second >= 0 && second <= 60 ); // leap seconds... maybe

    char *output = (char *) malloc( 9 * sizeof( char ) );
    if( output == NULL ) {
        return NULL;
    }
    output[0] = (char) ((hour / 10) + '0');
    output[1] = (char) ((hour % 10) + '0');
    output[2] = ':';
    output[3] = (char) ((minute / 10) + '0');
    output[4] = (char) ((minute % 10) + '0');
    output[5] = ':';
    output[6] = (char) ((second / 10) + '0');
    output[7] = (char) ((second % 10) + '0');
    output[8] = '\0';
    return output;
}

现在让我们放松一下对某些东西的限制。我们可以使用snprintf:

char *getHourMinuteSecond( int hour, int minute, int second ) {
    assert( hour >= 0 && hour < 24 );
    assert( minute >= 0 && minute < 60 );
    assert( second >= 0 && second <= 60 ); // leap seconds... maybe

    char *output = (char *) malloc( 9 * sizeof( char ) );
    if( output == NULL ) {
        return NULL;
    }
    snprintf( output, 9, "%02d:%02d:%02d", hour, minute, second );
    return output;
}

让我们保持稳定,让函数通过参数返回(这样我们就不需要使用malloc)了:

void getHourMinuteSecond( char target[9], int hour, int minute, int second ) {
    assert( target != NULL );
    assert( hour >= 0 && hour < 24 );
    assert( minute >= 0 && minute < 60 );
    assert( second >= 0 && second <= 60 ); // leap seconds... maybe

    snprintf( target, 9, "%02d:%02d:%02d", hour, minute, second );
}

坚持下去,最后一个功能主要是错误检查。我们可以再次变得愚蠢并使用#define

#define getHourMinuteSecond(tgt,h,m,s) snprintf(tgt,9,"%02d:%02d:%02d",h,m,s)

最后,在您的原始代码中,您不会将hourminutesecond作为参数,因此您可能希望该函数确定它们吗?

void getHourMinuteSecond( char target[9] ) {
    assert( target != NULL );
    const time_t now = time( 0 );
    const tm *const tmnow = localtime( &now );
    snprintf( target, 9, "%02d:%02d:%02d", tmnow->tm_hour, tmnow->tm_min, tmnow->tm_sec );
}

答案 2 :(得分:0)

你可以返回一个字符串,concat hour,min和sec,如:

str =小时+分钟+秒

这样做使用函数strcat(destination,source)(#include) 像那样的意志:

char *getHour(....)

{

char str[20];

strcpy(str,hour);

strcat(str,":");

strcat(str,min);

strcat(str,":");

strcat(str,"sec);

return str;

}