包含零的字符串初始化 --> 编译器错误或预期行为?
String initialisation containing zero --> compiler bug or intended behavior?
我尝试定义一些硬编码的 utf 序列。
喜欢
static std::string const cUTF_16_BE_BOM = "\xFE\xFFTest";
static std::string const cUTF_16_LE_BOM = "\xFF\xFETest";
static std::string const cUTF_8_BOM = "\xEF\xBB\xBFTest";
static std::string const cUTF_32_BE_BOM = "\x00\x00\xFE\xFFTest";
static std::string const cUTF_32_LE_BOM = "\xFF\xFE\x00\x00Test";
static std::string const cUTF_7_BOM = "\x2B\x2F\x76\x38\x2DTest";
但是 cUTF_32_BE_BOM 和 cUTF_32_LE_BOM 在第一种情况下产生空字符串,在第二种情况下产生长度为 2 的字符串。
难道 C++ 字符串不能在知道其实际大小的情况下处理其中的多个 '\0' 字符吗?我希望 strlen 到 return 0 和 2 作为长度或输出流只消耗到第一个 '\0'。但是没有按照写好的代码进行初始化在我看来有点奇怪。
这些将调用带有const char*
的std::string
构造函数:长度已经丢失,调用strlen
(std::char_traits<char>::length
)的等价物来获取尺码。
通常,您会使用 std::string_literals::operator""s
来不丢失 '[=17=]'
字符,但这在 ::
范围内可能不可行。它看起来像这样:
using namespace std::string_literals;
static std::string const cUTF_32_BE_BOM = "\x00\x00\xFE\xFFTest"s;
您还可以调用带有 const char*
和长度参数的构造函数:
static std::string const cUTF_32_BE_BOM("\x00\x00\xFE\xFFTest", 8);
// Or without hardcoding the size
static std::string const cUTF_32_BE_BOM("\x00\x00\xFE\xFFTest", sizeof("\x00\x00\xFE\xFFTest")-1);
// Or without copying the string
template<std::size_t N>
std::string make_string_from_literal(const char(&s)[N]) {
return std::string(s, N-1); // -1 for last '[=11=]' character
}
static std::string const cUTF_32_BE_BOM = make_string_from_literal("\x00\x00\xFE\xFFTest");
isn't a c++ string able to handle multiple '[=10=]' chars in it while knowing its real size?
是的,但您还没有 C++ 字符串。在您提供初始化程序之前问题就出现了。
I would expect a strlen to return 0 and 2 as length or an output stream only to consume until the first '[=11=]'.
那你就知道那是因为 C 字符串就是这样工作的。就像您的代码中的那些一样。 :)
But to be not initialized according to the written code is a bit strange in my perception.
是的。 ;)
我尝试定义一些硬编码的 utf 序列。
喜欢
static std::string const cUTF_16_BE_BOM = "\xFE\xFFTest";
static std::string const cUTF_16_LE_BOM = "\xFF\xFETest";
static std::string const cUTF_8_BOM = "\xEF\xBB\xBFTest";
static std::string const cUTF_32_BE_BOM = "\x00\x00\xFE\xFFTest";
static std::string const cUTF_32_LE_BOM = "\xFF\xFE\x00\x00Test";
static std::string const cUTF_7_BOM = "\x2B\x2F\x76\x38\x2DTest";
但是 cUTF_32_BE_BOM 和 cUTF_32_LE_BOM 在第一种情况下产生空字符串,在第二种情况下产生长度为 2 的字符串。
难道 C++ 字符串不能在知道其实际大小的情况下处理其中的多个 '\0' 字符吗?我希望 strlen 到 return 0 和 2 作为长度或输出流只消耗到第一个 '\0'。但是没有按照写好的代码进行初始化在我看来有点奇怪。
这些将调用带有const char*
的std::string
构造函数:长度已经丢失,调用strlen
(std::char_traits<char>::length
)的等价物来获取尺码。
通常,您会使用 std::string_literals::operator""s
来不丢失 '[=17=]'
字符,但这在 ::
范围内可能不可行。它看起来像这样:
using namespace std::string_literals;
static std::string const cUTF_32_BE_BOM = "\x00\x00\xFE\xFFTest"s;
您还可以调用带有 const char*
和长度参数的构造函数:
static std::string const cUTF_32_BE_BOM("\x00\x00\xFE\xFFTest", 8);
// Or without hardcoding the size
static std::string const cUTF_32_BE_BOM("\x00\x00\xFE\xFFTest", sizeof("\x00\x00\xFE\xFFTest")-1);
// Or without copying the string
template<std::size_t N>
std::string make_string_from_literal(const char(&s)[N]) {
return std::string(s, N-1); // -1 for last '[=11=]' character
}
static std::string const cUTF_32_BE_BOM = make_string_from_literal("\x00\x00\xFE\xFFTest");
isn't a c++ string able to handle multiple '[=10=]' chars in it while knowing its real size?
是的,但您还没有 C++ 字符串。在您提供初始化程序之前问题就出现了。
I would expect a strlen to return 0 and 2 as length or an output stream only to consume until the first '[=11=]'.
那你就知道那是因为 C 字符串就是这样工作的。就像您的代码中的那些一样。 :)
But to be not initialized according to the written code is a bit strange in my perception.
是的。 ;)