我有以下代码(在服务器[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 }}”。
我不知道造成这种情况的原因,因此找不到解决问题的方法。感谢您提前帮助解决这个愚蠢的问题。
答案 0 :(得分:2)
您的代码最重要的问题是
n = fread(packet, 1, PAYLOAD, fp2);
即使你正确使用它,下一行
packet[n] = '\0';
可能是错误的,因为如果n == PAYLOAD
这会在packet
数组结束后写入1个字节,那么你应该这样读
n = fread(packet, 1, PAYLOAD - 1, fp2);
如果您解决此问题,问题可能会消失,因为packet
数组似乎没有结果中的'\0'
终止符。
第二个非常重要的问题是使用sizeof(int)
表示整数的字符串表示。