2013-04-27 84 views
-5

我用下面的代碼的問題是我用sprintf的地方,我希望它插入一個格式化的int,因爲客戶端會根據char數組拾取數據並提取數據。因此,客戶端將從接收的代碼中獲取[0]和[1]的延遲。另一個變量可以從另一個代碼發送的[2]和[3]中獲取。什麼是printf的格式化它喜歡的方式被保存在一個char []在C中格式化SprintF

int sock = *(int*)data->sock; 
int i,startDelay =0; 
char buffer[SEND_MESSAGE_LENGTH]; 
puts("Run Machine Called"); 
for(startDelay=11;startDelay>=0;startDelay--) 
{ 
    printf("Start Delay:%i\n",startDelay); 
    sprintf(buffer,"%2i",startDelay); 
    printf("Send Data - %2i - Start Delay\n",*buffer-'0'); 
    //write_sock(sock,buffer); 
    sleep(1); 
} 
+0

什麼?爲什麼'sprintf(buf,「%i」,42);'不夠好(**除了緩衝區溢出漏洞**)? – 2013-04-27 19:22:24

+0

如果你想從左邊的嘗試格式「%02d」填充數字0 ......但我不明白這個問題...... – 2013-04-27 19:27:46

+0

基本上我的客戶端每次從服務器讀取時都需要接收11個0 。前兩個將是服務器中的一個變量,第二個設置另一個變量等等。如果我只是把startDelay放到char []中,它可能是'9',我需要它是'09',因爲它需要填充2個插槽,是更好的嗎? – Lacko 2013-04-27 19:32:32

回答

0

我不能肯定,但我認爲正在談論一個2字節(16位)整數值。如果是這樣,那麼sprintf不適合這份工作。相反,你應該採取的整數和掩碼,並轉移到提取16位:

buffer[0] = startDelay & 0xFF; // low byte 
buffer[1] = (startDelay >> 8) & 0xFF; // high byte 

當然,因爲你的值大於255時,這裏的高字節將始終爲零,因此它簡化爲:

​​

這不是很清楚,我的字節順序應該是什麼,所以你可能要扭轉這些,並把在buffer[0]高字節,在buffer[1]低字節。