繁体   English   中英

奇怪的printf行为

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM