我目前正在将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);
}
答案 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);
您不需要创建角色变量等等!