【发布时间】:2019-01-10 16:03:25
【问题描述】:
考虑以下代码:
const char foo[] = "lorem ipsum"; // foo is an array of 12 characters
const auto length = strlen(foo); // length is 11
string bar(length, '\0'); // bar was constructed with string(11, '\0')
strncpy(data(bar), foo, length);
cout << data(bar) << endl;
我的理解是strings 总是分配有一个隐藏的空元素。如果是这种情况,那么bar 确实分配了 12 个字符,其中第 12th 是隐藏的'\0',这是非常安全的......如果我错了,那么@987654326 @ 将导致未定义的行为,因为没有空终止符。
谁能帮我确认一下?这合法吗?
关于为什么使用strncpy 而不是仅仅使用string(const char*, const size_t) 构造函数,存在很多问题。我的意图是让我的玩具代码接近包含vsnprintf 的实际代码。不幸的是,即使在这里得到了很好的答案,我发现vsnprintf 的行为与strncpy 不同,我在这里提出了一个后续问题:Why is vsnprintf Not Writing the Same Number of Characters as strncpy Would?
【问题讨论】:
-
怎么可能不呢?当然,假设您复制的字节数不超过可用缓冲区空间。
-
@TrebuchetMS 是的,谢谢,我已经修正了该评论。
-
你有这方面的实际用例吗?如果你给
std::string一个 c 字符串,它会做同样的事情而不会让人头疼。 -
@NathanOliver 是的,我正在使用
vsnprintf来填充string。似乎只是增加了要问的问题的复杂性,并没有强迫这个问题。 -
那为什么不用
std::string bar( foo, length );而不是讨厌的strncpy()?
标签: c++ string c-strings strncpy null-terminated