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

strncpy并使用sizeof复制最大字符数,c,strncpy,C,Strncpy,我正在使用下面的代码 char call[64] = {'\0'} /* clean buffer */ strncpy(call, info.called, sizeof(call)); 我总是使用sizeof作为目标来保护溢出,以防源大于目标。通过这种方式,我可以防止缓冲区溢出,因为它只能复制目标可以处理的内容 但我现在想知道它是否会终止目的地 几个案子 1) 如果来源更大。 我可以这样做: call[strlen(call) - 1] = '\0'; /* insert a null a

我正在使用下面的代码

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) 如果源小于目标。 调用是64个字节,我复制了50个字节,因为这是源的大小。它会自动在51元素中输入空值吗

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

您的想法:

call[strlen(call) - 1] = '\0';
将不起作用,因为如果源的长度小于作为第三个参数传递的最大值,则您将对未终止的字符串调用
strlen()
,否则,strncpy将为null终止目标,否则-not

如果源代码的长度等于或大于目标代码的长度,那么处理它是您的问题。按照您的建议执行-调用strlen()-将不起作用,因为缓冲区不会以null结尾,并且您将遇到未定义的行为

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

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

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

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

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

不,strncpy不保证目标字符串以null结尾

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) From:“没有空字符隐式附加到目标的末尾,因此只有当源中的C字符串长度小于num时,目标才会以空结尾。”因此,如果您需要字符串以空结尾,则需要执行以下操作:

call[sizeof(call) - 1] = '\0';
这样做的一个好方法是为
strncpy
编写一个包装函数,该函数始终确保字符串被终止

char tar[2]={0,0};
char bar="AB";
strncpy(tar,bar,2);
// result tar[0]=='A'; tar[1]=='B'
2) 如果源短于目标,则目标将以null结尾。

只需使用strlcpy()而不是strncpy()。
char tar[2]={0,0};
char bar="AB";
strncpy(tar,bar,2);
// result tar[0]=='A'; tar[1]=='B'
您必须检查它是否在所有平台上都可用。
早期版本的linux可能没有它。

使用strlcpy的方式与strncpy相同。无需在第三个参数中进行尺寸-1

i、 e:
strncpy(call,info.called,sizeof(call)-1)
strlcpy(call,info.called,sizeof(call))

确保目的地在此处以nul终止的一种简单方法是执行call[sizeof call-1]=0;我不认为strncpy会终止字符串。通过不终止字符串。这会导致真正的问题吗?另外,通过执行此调用[strlen(info.called-1]='\0';如果源大于或小于目标,那么终止的正确方法是什么?谢谢。是的,未终止的字符串将导致
strlen()
strcat()
,等等。如果字符串比目标短,则将缓冲区的最后一个字节设置为零不会造成任何损害,因此确实没有理由将其设置为有条件的。如果您使用VC++,我建议使用strncpy\u,它确保字符串始终被终止trncpy()是指当源字符串短于目标字符串时,它总是将目标字符串填充到指定的长度。如果将32字节的数据复制到4 KB缓冲区中,这一点很重要;与32字节的数据一样,它将复制4064'\0'个字符,这可能会成为一个问题。在我看来,strncpy()设计用于将最多14个字符的文件名组件复制到旧Unix目录项的文件名部分。文件名部分最多14个字符,以null填充,但不以null结尾(前面两个字节是2字节的索引节点号)。我只是想知道。使用strlen或sizeof有什么真正的区别吗?sizeof是常量,当strlen在运行时实际计算字符串的长度时,它返回sizeof objet。例如,对于char tar[2]={0,0};sizeof(tar)==2,但是,strlen(tar)==0;这不是一个标准函数。它可能不可用。
-1
应该在这里做什么?它只会将问题移位一个字节。如果字符串不适合
sizeof(调用)-1
bytes,剩余的最后一个元素仍然不会被
0
填充。另外,6年前已经建议使用
strlcpy
。这仅在调用前将目标缓冲区清除为0时有效。对于一般使用来说没有太大帮助。