gpt4 book ai didi

c - 如何: Safeguard memory - strncat()?

转载 作者:可可西里 更新时间:2023-11-01 09:56:24 25 4
gpt4 key购买 nike

function(char *a, char *b)
{

char newStr[100];

strncpy(newStr, a, sizeof(newStr)); //Line 1 - copy no more than 100 bytes

strncat(newStr, b, (sizeof(newStr) - strlen(newStr))); //Line 2 - ?

newStr[99] = NULL; //Line 3 - null terminate string

}

第 2 行:正确指定 100 bytes 减去从 a 复制过来的内容的 strlen 以确保我不会复制超过 100 个字节?

谢谢。

最佳答案

strncpy() 并不像您认为的那样。

strncat()strcat() 的“更安全”版本,可让您指定目标数组的大小。

strncpy() 不是strcpy() 的相应“更安全”版本。如果目标数组太大,strncpy() 会用空字符填充它; 99% 的情况下这是不必要的,因为您只需要一个 '\0' 来标记字符串的结尾。更糟糕的是,如果目标数组太小,strncpy() 将复制尽可能多的字符并使目标未终止

strncpy() 是为早期 Unix 系统用来存储文件名的一种晦涩的数据结构而设计的。文件名存储在用空字节填充的固定长度的 14 字节缓冲区中。如果文件名恰好是 14 个字符长,则不会有空终止符。 这不是字符串

万一那是您想要的那种数据结构,那么 strncpy() 就是这样。否则,不要使用它;确认目标足够大后使用strcpy()即可。

我可能会这样写这个函数:

void function(char *a, char *b)
{
char newStr[100];

/* Make newStr an empty string so you can concatenate onto it */
newStr[0] = '\0';
strncat(newStr, a, sizeof newStr - 1); /* edited */
strncat(newStr, b, sizeof newStr - strlen(newStr) - 1); /* edited */

/* Presumably you do something with newStr here */
}

注意事项:

  1. 声明函数的返回类型。如果您没有显式声明它,您的编译器可能会默认为 int,但这是一种糟糕的风格和过时的语言功能。
  2. 避免strncat()
  3. 我使用了 '\0',而不是 NULL,以 null 终止字符串。 NULL 是一个空指针常量;不要用它来表示空字符

这里效率很低:第二个strncat() 必须从newStr 开始重新扫描。对于少量的短字符串,这没什么大不了的,但是对于连接成大型目标数组的大量字符串,它可能会导致严重的速度下降。有很多解决方法,但它们要么是非标准的(strlcpy()strlcat()),要么不方便。

编辑:感谢 Matthew 指出我代码中的错误。我认为我已经修复了它们;如果我用新的错误替换了旧的错误,我确信我可以指望有人来打我的脑袋。

另一种方法是:

snprintf(newStr, sizeof newStr, "%s%s", a, b);

关于c - 如何: Safeguard memory - strncat()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7922647/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com