我正在使用下面的代码
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
如果源的长度小于作为第三个参数传递的最大数目,则strncpy将使目标以null终止,否则-否。
如果源的长度等于或大于目标的长度-处理它是您的问题。像您建议的那样-调用strlen()-将不起作用,因为缓冲区不是以null终止的,并且您将遇到未定义的行为。
您可以分配更大的缓冲区:
char buffer[bufferSize + 1];
strncpy( buffer, source, bufferSize );
*(buffer + bufferSize ) = 0;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
13872 次 |
| 最近记录: |