繁体   English   中英

strncpy 并使用 sizeof 复制最大字符数

[英]strncpy and using sizeof to copy maximum characters

我正在使用下面的代码

char call[64] = {'\0'} /* clean buffer */
strncpy(call, info.called, sizeof(call));

我总是使用 sizeof 作为目标来保护溢出,以防源大于目标。 这样我可以防止缓冲区溢出,因为它只会复制目标可以处理的数量。

但我现在想知道它是否会终止目的地。

几个案例。

1)如果来源更大。 我可以这样做:

call[strlen(call) - 1] = '\0'; /* insert a null at the last element.*/

2) 如果源小于目标。 call 是 64 个字节,我复制了 50 个字节,因为这是源的大小。 它会自动将空值放在 51 元素中吗?

非常感谢您提供任何信息,

strncpy截断字符串,则它不会空终止目标。 如果必须使用strncpy ,则需要确保结果已终止,例如:

strncpy(call, info.called, sizeof(call) - 1);
call[sizeof(call) - 1] = '\0';

BSD 的strlcpy()等,通常被认为是优越的:

http://www.openbsd.org/cgi-bin/man.cgi?query=strlcpy

如果源的长度小于作为第三个参数传递的最大数量,strncpy 将空终止目标,否则 - 不。

如果源的长度等于或大于目标的长度 - 处理它是您的问题。 像你建议的那样 - 调用 strlen() - 将不起作用,因为缓冲区不会以空值结尾,你会遇到未定义的行为。

您可以分配更大的缓冲区:

char buffer[bufferSize + 1];
strncpy( buffer, source, bufferSize );
*(buffer + bufferSize ) = 0;

你的想法:

call[strlen(call) - 1] = '\0';

将不起作用,因为您将在未终止的字符串上调用strlen()

但我现在想知道它是否会终止目的地。

不,strncpy 不保证目标字符串将以空字符结尾。

char tar[2]={0,0};
char bar="AB";
strncpy(tar,bar,2);
// result tar[0]=='A'; tar[1]=='B'

为了使其正确,您应该使用:

strncpy(traget,string,sizeof(target)-1);
target[sizeof(target)-1]=0

1) 来自cplusplus.com :“没有空字符被隐式附加到目的地的末尾,所以如果源中的 C 字符串的长度小于 num,目的地只会以空字符结尾。” 因此,如果您需要以空字符结尾的字符串,则需要执行以下操作:

call[sizeof(call) - 1] = '\0';

一个很好的方法是为strncpy编写一个包装函数,它总是确保字符串被终止。

2) 如果源短于目标,则目标将以空结尾。

只需使用 strlcpy() 而不是 strncpy() 。 您必须检查它是否在所有平台上都可用。 早期版本的 linux 可能没有它。

以与 strncpy 相同的方式使用 strlcpy。 不需要在第三个参数中做 size-1

即: strncpy(call, info.called, sizeof(call)-1); strlcpy(call, info.called, sizeof(call));

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM