[英]Weird printf behavior
我正在编写一个套接字程序,该程序模拟一个简单的游戏,例如通过枕头。 有一个主程序可以连接到多个播放器程序(它们都在环形网络中连接)。 主人选择一个随机的球员,并给它枕头可以跳的次数。 然后,玩家减少啤酒花,将其名称放在枕头上,然后将其传递给随机的相邻玩家。 最终,当跳数达到零时,玩家将枕头退还给印刷枕头路径的主人。
例如,在一个有5个玩家的游戏中:假设玩家3收到了包含“ 3”(跳数)的枕头。 它将其传递给玩家2(随机),后者收到“ 2 $ 3”(2跳,玩家3处于跟踪状态)。 玩家2将其传递回玩家3,后者收到“ 1 $ 3,2”(1跳,玩家3-> 2)。 现在,播放器3放置自己的名称,并将其发送回接收“ 0 $ 3,2,3”的主机。 母版打印此。
我在制作枕头时遇到问题。 对于较小的数字,该程序运行良好(<750跳)。 如果我将其增加到超过750跳,则该程序会随机在〜750跳处停止并直接跳至0。以下是在播放器的每次迭代中创建马铃薯的代码。 它得到一个类似“ 4 $ 6,5,6,7,8,9,8”的输入,更改跳数并在最后添加id。 对于Hops = 3,id = 7,输出将为“ 3 $ 6,5,6,7,8,9,8,7”。
void createPotato(int id, int hops, char pot[20000])
{
int i, j;
char t[20000];
char d[10];
strcpy(t, pot);
for(j = 0; t[j] && t[j] != '$'; j++);
snprintf(pot, 20000, "%d", hops);
for(i = 0; i < 20000; i++)
if(pot[i] == '\0')
break;
pot[i++] = '$';
if(t[j])
{
for(j = j + 1; t[j]; j++)
pot[i++] = t[j];
pot[i++] = ',';
}
snprintf(d, 10, "%d", id);
for(j = 0; d[j]; j++)
pot[i++] = d[j];
pot[i] = '\0';
}
int getHopsFromPotato(char pot[20000])
{
char t[20000];
strcpy(t, pot);
char *hops = strtok(t, "$");
return atoi(hops);
}
有趣的是:如果我修改上面的代码以将将“ id”添加到“ pot”的部分更改为以下内容,则它可以工作。
snprintf(d, 10, "%d", id);
for(j = 0; d[j]; j++)
pot[i++] = d[j];
至
pot[i++] = '0';
然后就可以了。 如果我将其更改为
pot[i++] = '2';
然后它也起作用。 但是,当我将其更改为
pot[i++] = '1';
然后,在大约750跳之后执行停止。 我什至无法开始解决这个问题。 不知道我是否提供了足够的细节或我应该提供的东西。 如果有帮助,输出如下。
对于玩家= 2,跳数= 1000(其中pot [i ++] ='0')
Pot: 268$1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
Hops: 268
Pot: 266$1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,,1
Hops: 266
Pot: 0$1
266之后,它突然跳过其后的所有跃点,擦除电位器,然后将其返回给主控制器。
如果需要添加任何详细信息,请告诉我。 我没有添加整个代码,因为它太长了。
由于您是通过套接字编写马铃薯的,因此随着马铃薯的变大,您最终可能会达到一次操作系统在一次send
/ recv
调用中send
的数量的极限。 确保套接字处理代码检查返回值以查看实际接收了多少数据,并在必要时再次调用recv
。
该问题可能是不确定的,与您存储在数组中的实际值实际上无关。 您描述的更改将导致生成相同的机器代码,并在相同的时间内运行。 但是,网络始终是不确定的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.