2012-12-18 18 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);

你不需要創建一個字符變量等等!