[英]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()
等,通常被认为是优越的:
如果源的长度小于作为第三个参数传递的最大数量,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.