如何用前导零填充整数打印?

时间:2019-05-02 13:49:15

标签: c arrays integer printf

所以我必须像一个计时器一样,它必须是一个字符串,并且如果它小于10,则必须有一个0,这样就像00,01,02 ... 09,10,11数字是2位数字。但是我遇到了一个问题,我似乎无法解决。而且我需要使其有点像没有ctime或完全不将其转换为字符串。

我也使用反编译器工具尝试过几次,但是我发现主要问题出在位置4和7。我认为代码块编译器可能有问题,但是我不确定

#include <stdio.h>

int main(){
    char tostring[9]={};
    int timer=6588;
    int hours=0;
    int minutes=0;
    int seconds=0;

    hours=timer/3600;
    minutes=(timer%3600)/60;
    seconds=(timer%3600)%60;
    //printf("%i:%i:%i",hours,minutes,seconds);

    if(hours<10){
        tostring[0]=(char)0;
        tostring[1]=(char)hours;
    }else{
        tostring[0]=(char)(hours/10);
        tostring[1]=(char)(hours%10);
    }
    tostring[2]=':';
    if(minutes<10){
        tostring[3]=(char)0;
        tostring[4]=(char)minutes;
    }else{
        tostring[3]=(char)(minutes/10);
        tostring[4]=(char)(minutes%10);
    }
    tostring[5]=':';
    if(seconds<10){
        tostring[6]=(char)0;
        tostring[7]=(char)seconds;
    }else{
        tostring[6]=(char)(seconds/10);
        tostring[7]=(char)(seconds%10);
    }
    tostring[8]='\0';
    printf("%s",tostring);
    return 0;
}

我希望输出为01:49:48,但是什么也没出现,只是空白。解决该问题的解决方案是什么。

2 个答案:

答案 0 :(得分:2)

相反,为什么不打印具有固定宽度并用0填充的整数?

类似

 printf("%02i:%02i:%02i",hours,minutes,seconds);

应该做这项工作。

格式规范%02i的解释:

  • %转换说明符的开始
  • 00个用于填充(如果该值的实际长度小于最小字段宽度)
  • 最小字段宽度的
  • 2值。
  • i整数

修改后的代码:

#include <stdio.h>

int main(void){

    int timer=6588;
    int hours=0;
    int minutes=0;
    int seconds=0;

    hours=timer/3600;
    minutes=(timer%3600)/60;
    seconds=(timer%3600)%60;

    printf("%02i:%02i:%02i",hours,minutes,seconds);

    return 0;
}

答案 1 :(得分:2)

tostring[0]=(char)0;不会将0的字符表示形式写入tostring [0]。它写一个零。您想要tostring[0] = '0',并用单引号引起来。同样,要写一个数字的字符表示形式,可以写tostring[1] = '0' + hours(如果小时数是5,则“ 0” + 5是用于表示本地字符集中的5的字符值值得庆幸的是,很早以前就已经标准化了这些表示形式,这些表示形式应该是顺序的,这样才能起作用。)但是,除非本练习的目的是避免使用printf,否则实际上应该只使用printf。