是否有一种安全的方法可以断言字符串视图是否以 null 终止?



我的代码中有一部分广泛使用字符串视图。在任何地方都使用std::string是不可想象的,而且char const*不起作用,因为存在关联容器、许多比较以及此类操作,而这些操作很难用普通的原始字符串来做。

但是,有一个地方最终将处理C API,它需要以空结尾的字符串:

auto sv = std::string_view{/* ... */};
c_api(sv.data());

虽然这在我的情况下工作正常,但我想确保一切正常并断言字符串以 null 结尾,因为我构建字符串视图并将其发送到那里的系统不会使用子字符串视图,并且会从字符串文字或std::string制作它们。我知道我会没事的。

然而,问题是另一个程序员可能不知道所有这些,并尝试在字符串视图上使用substr,或发送一个非 null 终止的字符串。以 null 结尾的非 null 字符串是不好的,因为它会导致未定义的行为,但字符串视图中的子字符串更糟糕,因为发送到 C API 时不会应用上限,也不会调用未定义的行为,而是会引入一个非常难以找到的意外行为的错误。

所以我想用断言来传达这一点:

auto sv = std::string_view{/* ... */};
assert(*(sv.data() + sv.length()) == ''); // Yay?
c_api(sv.data());

但我发现它不完整且容易出错,因为它可能会超出以 null 结尾的字符串的界限。

有没有办法安全地断言字符串视图确实以 null 终止?

这可能很痛苦,但我会编写我自己的string_view,保证以 null 结尾。

由于string_view可以像

char array[3] = {'B', 'a', 'r'};
std::string_view array_v(array, sizeof array);

测试

*(sv.data() + sv.length()) == ''

在这种情况下是未定义的行为,因为最后一个有效索引是2但您访问3std::string_view需要公开它无法知道的信息才能让您执行此操作,并且由于它不能,因此您无法可靠地知道。

最新更新