插入没有空终止符空间的字符串是否安全?
Is it Safe to strncpy Into a string That Doesn't Have Room for the Null Terminator?
请考虑以下代码:
const char foo[] = "lorem ipsum"; // foo is an array of 12 characters
const auto length = strlen(foo); // length is 11
string bar(length, ' '); // bar was constructed with string(11, ' ')
strncpy(data(bar), foo, length);
cout << data(bar) << endl;
我的理解是,string
总是用隐藏的空元素分配的。如果是这种情况,那么bar
真的分配了 12 个字符,第 12个字符是一个隐藏的' '
,这是完全安全的......如果我错了,那么cout
将导致未定义的行为,因为没有空终止符。
有人可以帮我确认吗?这合法吗?
关于为什么要使用 strncpy
而不是只使用 string(const char*, const size_t)
构造函数,有很多问题。我的目的是让我的玩具代码接近我包含vsnprintf
的实际代码。不幸的是,即使在这里得到了很好的答案,我发现vsnprintf
的行为与strncpy
不同,我在这里问了一个后续问题:为什么 vsnprintf 没有像 strncpy 那样写入相同数量的字符?
这是安全的,只要您将[0, size())
字符复制到字符串中即可。 每 [基本字符串]/3
在所有情况下,
[data(), data() + size()]
都是有效范围,data() + size()
指向值为charT()
的对象("空终止符"),size() <= capacity()
true
。
因此,string bar(length, ' ')
为您提供一个size()
为 11 的字符串,末尾有一个不可变的 null 终止符(实际大小总共为 12 个字符)。 只要您不覆盖该空终止符,或尝试写过它,您就可以了。
这里有两件不同的事情。
首先,strncpy
在此实例中添加额外的