strcpy()总是会遗漏一些字符

时间:2017-11-27 01:38:51

标签: c strcpy

我正在使用UDP协议传输文件,但是当我使用strcpy()将缓冲区复制到另一个字符串时,它总是会丢失一些字符。

简单的想法是: 我定义了一个结构:

struct frame{
    int kind;//transmission(0) or retransmission(1)
    int seq;
    int ack;
    char info[256];
};

然后我使用fread将文本文件的内容放入缓冲区:

char buffer[256] = {0};
fread(buffer, 256, 1, fp);//read file: 256 byte
struct frame currFrame;
currFrame.ack = 0;

bzero(currFrame.info, 256);
strcpy(currFrame.info, buffer); //store the content to transfer
printf("%s\n", buffer);
printf("%s\n", currFrame.info);

上面的代码是for循环,因为我多次读取文件。

当我使用printf(),半场时,结果是正确的。但是一半时间,他们是不同的(就像在头脑中遗漏了一些角色)。我该如何解决这个问题?

附加输出(上面是缓冲区,它是正确的):

enter image description here

1 个答案:

答案 0 :(得分:4)

strcpy函数仅适用于字符串。要复制任意数据,请使用memcpy。此外,%s格式说明符仅适用于字符串。像fread这样的函数会读取任意二进制数据,而不会尝试形成字符串。

此外,您以这样一种方式调用fread,它不会告诉您实际读取的字节数。除非你是肯定的,否则你总是要读取256个字节,这并不聪明。而是将fread的第二个参数设置为1,并使用第三个参数设置要读取的最大字节数。并且不要忽略返回值 - 这就是你知道它实际能够读取多少字节的方式。