【问题标题】:strcpy() always miss some charactersstrcpy() 总是漏掉一些字符
【发布时间】:2017-11-27 01:38:50
【问题描述】:

我正在使用 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() 时,一半时间,结果是正确的。但是一半时间,它们是不同的(比如在头部缺少一些字符)。我该如何解决这个问题?

附加输出(上面是缓冲区,没错):

【问题讨论】:

  • buffer 不是以空值结尾的。

标签: c strcpy


【解决方案1】:

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

另外,您调用fread 的方式是它不会告诉您它实际读取了多少字节。除非你确定你总是会准确地读取 256 个字节,否则这并不聪明。相反,将fread 的第二个参数设置为1,并使用第三个参数设置要读取的最大字节数。并且不要忽略返回值——这就是你知道它实际能够读取多少字节的方法。

【讨论】:

  • 谢谢。但抱歉我还是不明白,你可以看到当我打印缓冲区时,它工作正常,所以我认为 fread() 工作正常。由于缓冲区是字符串,所以结构中的信息也被定义为字符串,所以 strcpy() 应该可以工作。
  • @user419050 为什么你认为fread返回后缓冲区是一个字符串? fread 函数不是字符串函数。
猜你喜欢
  • 2010-10-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-28
  • 2011-07-16
  • 2011-07-04
  • 1970-01-01
  • 2021-10-09
相关资源
最近更新 更多