连接int和字符串时sprintf无法正常运行

时间:2015-12-04 01:09:31

标签: c file printf

我有以下代码(在服务器[sender]程序中):

#define PAYLOAD 256

//...some more code...

    int l;
    char packet[PAYLOAD];
    char seqNumNpacket[sizeof(l) + sizeof(packet) + 1]; //to account for the number, space and the packet

    FILE *fp2;
    fp2 = fopen(req, "r");
    l = 0;        
    char seqNumNpacket[sizeof(l) + sizeof(packet) + 1];
    //... some more code...
    n = fread(packet, 1, PAYLOAD, fp2);
    packet[n] = '\0';
    printf("%s", packet);
    sprintf(seqNumNpacket, "%d %s", l, packet);
    printf("%d %s", seqNumNpacket); //A

这里我尝试从文件中读取字节,然后将其放在一个带有数字的字符串中,以便我可以使用sendto() / recvfrom将其发送到其他进程。

当我使用sprintf将它们粘在一起时会出现问题。不知何故,不是写出“seqNum packet”的时尚字符串,而是“seqNum packet {{1 }}”。

我不知道造成这种情况的原因,因此找不到解决问题的方法。感谢您提前帮助解决这个愚蠢的问题。

1 个答案:

答案 0 :(得分:2)

  1. 您的代码最重要的问题是

    n = fread(packet, 1, PAYLOAD, fp2);
    

    即使你正确使用它,下一行

    packet[n] = '\0';
    

    可能是错误的,因为如果n == PAYLOAD这会在packet数组结束后写入1个字节,那么你应该这样读

    n = fread(packet, 1, PAYLOAD - 1, fp2);
    

    如果您解决此问题,问题可能会消失,因为packet数组似乎没有结果中的'\0'终止符。

  2. 第二个非常重要的问题是使用sizeof(int)表示整数的字符串表示。