2012-12-18 19 views
0

我目前转换Csharp的程序到Unix的C.它的运行良好,除了:显示在字符的int,有一些修改

我有一个整数(秒)含有秒数,对于美学原因,我想显示前零(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); 
} 

回答

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); 
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); 
} 
1

的代码将出现在sprintf()称为st_str未定义行为是未初始化指针。 st_str需要指向有效的内存。

然而,打印前导零使用格式说明"%02d"。例如:

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

并避免if/else

1

卸下大的if/else结构和替换为:

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

你的版本是不工作,因为%i期望一个int和你喂养它字符指针。你可以用%s来“修复”它,但是对于标准函数可以为你做的事情,你做的工作太多了。

0

使用此如下:

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

或者,如果你只是想显示使用printf("%02d",secs),直接公关int输出屏幕。

编辑:但请记住是sprintf的情况下,您必须分配内存st_str以保持secs的值。

0

为什么它转换为字符串的。 printf可以与填充

对于例如显示该数字。

int secs; 

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

或者,如果你想在一个字符串

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

我认为它应该是'<= 59' – Omkant

0

要打印最小的n数字,你可以使用精确点的格式,如:

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

你不需要创建一个字符变量等等!