由于没有人提到sprintf
您可以使用它将任何变量转换为char*并发送
if(strcmp(buf,"movUP") == 0)
{
char* msg = calloc(1, 20);
pos.y += 0.0001f;
sprintf(msg,"NEW::POS::Y=%.4f", pos.y);
sendto(master, msg, 20, 0, (struct sockaddr*)&client, addrlen);
}
测试
movUP
NEW::POS::Y=0.0001
movUP
NEW::POS::Y=0.0002
movUP
NEW::POS::Y=0.0003
movUP
NEW::POS::Y=0.0004
使用%d 表示整数,%f 表示浮点数
要转回为整数,请使用atoi(char*)
转换回为浮点数,使用atof(char*)
在转换之前,一定要使用strstr()获取浮点值only,从"0"开始
float myPos; // floating variable that stores Object's Position in the World
...
....
memset(buf, 0, MAXBUFFER); // clears the previous buffer
recvfrom(master, buf, MAXBUFFER, 0, (struct sockaddr*)&server, &addrlen);
char* newY = strstr(buf, "0");// NEW::POS::Y=0.0001 --->> 0.000100
myPos = atof(newY); // new object's position by the server
printf("My New Position is %.4f\n", myPos); // Out: My New Position is 0.0011 -> 0.0012 -> 0.0013 -> 0.0014.
对于整数(不是位),您可以使用相同的技术,然后将其相乘
float f = 0.000002f; // that is supposed to be 2 integer value
int i = (int)(f*1000000); // now, i = 2
以上方法完全安全
如果您想要更可靠的转换,您可以使用strncpy 或memcpy 并从给定索引开始剪切字符串,假设您已经知道传入缓冲区,但在我个人看来,我不知道' 真的不推荐它,特别是在像这样的 connectionless 套接字中,大量计算和要求缓冲区长度,如果您不完全了解自己在做什么,有时不容易调试。
注意 1:当您等待一个服务器 move/position 命令或任何
如果您打算使用 1st 方法,则为数量变量。
注意 2:您可以发送 integer 或 float,转换它 和 vice反之亦然,无需剪切或相乘。
也许新的游戏网络开发者会发现这个答案也很有用,因为除了char* 和 UDP sendto()、recvfrom() 之外,我们无法发送或接收。