奇怪的printf行为

时间:2016-03-27 01:09:54

标签: c++ c sockets

我正在编写一个套接字程序,它可以模拟像枕头一样的简单游戏。有一个主程序连接到多个播放器程序(都在环形网络中连接)。主人选择一个随机播放器,并给它枕头可以采取的跳数。然后玩家减少跳跃,将其名字放在枕头上并将其传递给随机的邻居。最后,当跳数达到零时,玩家将枕头返回给打印枕头路径的主人。

例如,在5名玩家的游戏中: 让我们说玩家3收到包含“3”(这是跳数)的枕头。 它将它传递给玩家2(随机)接收“2 $ 3”(2跳,跟踪玩家3)。 玩家2将其传递给接收“1 $ 3,2”(1跳,玩家3> 2)的玩家3。 玩家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之后,它突然跳过所有的啤酒花,擦掉锅,然后将它还给主人。

如果我需要添加任何详细信息,请与我们联系。我没有添加整个代码,因为它太长了。

1 个答案:

答案 0 :(得分:1)

由于您正在通过套接字编写马铃薯,因此随着它变得越来越大,您最终会在单个send / recv调用中达到操作系统发送量的限制。确保套接字处理代码检查返回值以查看实际接收的数据量,并在必要时再次调用recv

该问题可能不确定,并且实际上与您在数组中存储的实际值无关。您所描述的更改将导致生成相同的机器代码,该代码在相同的时间内运行。然而,网络始终是不确定的。