2013-04-27 86 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]低字节。