strncpy并使用sizeof复制最大字符

ant*_*009 6 c strncpy

我正在使用下面的代码

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

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

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

几个案例.

1)如果来源更大.我能做到这一点:

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

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

非常感谢任何信息,

Tim*_*ter 15

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

strncpy(call, info.called, sizeof(call) - 1);
call[sizeof(call) - 1] = '\0';
Run Code Online (Sandbox Code Playgroud)

strlcpy()除其他外,BSD 通常被认为是优越的:

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


sha*_*oth 6

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

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

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

char buffer[bufferSize + 1];
strncpy( buffer, source, bufferSize );
*(buffer + bufferSize ) = 0;
Run Code Online (Sandbox Code Playgroud)