0

我目前正在将 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);
}
4

7 回答 7

1

sprintf()被调用为st_str未初始化的指针时,代码将遇到未定义的行为。st_str需要指向有效的内存。

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

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

并避免if/else.

于 2012-12-18T17:51:42.397 回答
1

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

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

您的版本不起作用,因为%i需要一个 int 并且您正在向它提供一个指向 char 的指针。您可以使用 来“修复”它%s,但是对于标准功能可以为您做的事情,您所做的工作量太大了。

于 2012-12-18T17:51:56.443 回答
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);
于 2012-12-18T17:52:16.623 回答
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);
}
于 2012-12-18T17:51:03.450 回答
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.

于 2012-12-18T17:52:32.187 回答
0

为什么将它转换为字符串。printf可以用填充显示数字

例如。

int secs;

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

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

char s[20];
snprintf(s, 20,"%02d", secs);
于 2012-12-18T17:56:36.963 回答
0

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

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

您不需要创建字符变量等!

于 2012-12-18T17:58:29.990 回答