在char中显示int,并进行一些修改

时间:2012-12-18 17:48:55

标签: c string pointers char printf

我目前正在将Csharp程序转换为Unix C.它运行良好,除了:

我有一个包含若干秒的整数(秒),出于审美原因,我想要显示前零(1-> 01等)。我编写的代码在下面,它有时可以工作,有时也不工作,这取决于它的调用位置。我怀疑问题出在指针上。

char *st_str;
if(secs<10)
{
   if(secs==0) st_str = "00";
   else if(secs==1) st_str = "01";
   else if(secs==2) st_str = "02";
   else if(secs==3) st_str = "03";
   else if(secs==4) st_str = "04";
   else if(secs==5) st_str = "05";
   else if(secs==6) st_str = "06";
   else if(secs==7) st_str = "07";
   else if(secs==8) st_str = "08";
   else if(secs==9) st_str = "09";
}
else
{
   sprintf(st_str,"%i",secs);
}

7 个答案:

答案 0 :(得分:1)

当调用sprintf()时,代码将遇到未定义的行为,因为st_str是未初始化的指针。 st_str需要指向有效的记忆。

但是,要打印前导零使用格式说明符"%02d"。例如:

char st_str[32];
snprintf(st_str, sizeof(st_str), "%02d", secs);

并避开if/else

答案 1 :(得分:1)

删除那个大的if / else构造并替换为:

sprintf(st_str, "%02d", secs);

您的版本无效,因为%i需要一个int,而您正在为它提供一个指向char的指针。你可以用%s“修复”它,但这对于标准函数可以为你做的事情做了太多的工作。

答案 2 :(得分:1)

如果你想sprintf()到st_str,你必须为它分配内存。但是,你提出的代码绝对是多余的。为什么不使用%02d格式说明符?此外,sprintf()通常被认为是不安全的,请改为使用snprintf()

char st_str[3];
snprintf(st_str, sizeof(st_str), "%02d", secs);

请注意,如果您想从函数返回st_str,则无法使用自动数组,但您应该编写

const size_t size = 3;
char *st_str = malloc(size);
snprintf(st_str, size, "%02d", secs);

答案 3 :(得分:0)

您可以将零置于格式字符串中并使用sprintf(...)

sprintf(st_str,"0%d",secs);

现在请注意,由于您可以在同一语句中概括0-9之间的所有秒数,因此switch语句可能更合适:

str_str = malloc(<max-digits-here>);

switch(secs) 
{
   case 0:
   case 1:
   case 2:
   case 3:
   case 4:
   case 5:
   case 6:
   case 7:
   case 8:
   case 9:
      sprintf(st_str,"0%d",secs);
      break;
   default:
      sprintf(st_str,"%d",secs);
}

答案 4 :(得分:0)

使用以下内容:

if(secs >=0 && secs < 10)
 sprintf(st_str,"0%d",secs);
else
 sprintf(st_str,"%d",secs);

或者,如果您只想显示使用printf("%02d",secs)并直接将其打印到输出屏幕。

编辑:但请记住sprintf的情况,您必须为st_str分配内存才能保留secs的值。

答案 5 :(得分:0)

为什么要将它转换为字符串。 printf可以使用填充

显示数字

例如。

int secs;

for(secs = 0; secs < 60; ++secs)
    printf("%02d\n", secs);

或者如果你想要一个字符串

char s[20];
snprintf(s, 20,"%02d", secs);

答案 6 :(得分:0)

要打印最少n个数字,您可以使用格式化程序中的精度点,如下所示:

printf("%.2d", secs);

您不需要创建角色变量等等!