- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我们正在将 C 代码转换为 C++。
我注意到以下代码在 C 中定义良好,
int main(){
//length is valid. '\0' is ignored
char str[3]="abc";
}
正如 Array initialization 中所述那个:
"If the size of the array is known, it may be one less than the size of the string literal, in which case the terminating null character is ignored."
但是,如果我要在 C++ 中构建相同的代码,我会收到以下 C++ 错误:
error: initializer-string for array of chars is too long
[-fpermissive] char str[3]="abc";
我希望有人能解释一下。
问题:
代码示例在所有 C 语言标准中都有效吗?
是不是在所有 C++ 语言标准中都无效?
是否存在在一种语言中有效但在另一种语言中无效的原因?
最佳答案
您在这里看到的是 C 和 C++ 中 cstring 初始化规则的不同。在 C11 §6.7.9/14 我们有
An array of character type may be initialized by a character string literal or UTF−8 string literal, optionally enclosed in braces. Successive bytes of the string literal (including the terminating null character if there is room or if the array is of unknown size) initialize the elements of the array.
强调我的
只要数组对于不包括空终止符的字符串足够大,它就有效。所以
char str[3]="abc";
是有效的 C。在 C++14 中,但在 [dcl.init.string]/2 状态中找到的管理此规则的规则
There shall not be more initializers than there are array elements.
接着显示下面的代码是错误的
char cv[4] = "asdf"; // error
因此,在 C++ 中,您必须为包括空终止符在内的整个字符串文字提供足够的存储空间。
关于c++ - 哪些语言标准允许忽略固定大小数组上的空终止符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37861600/
我有一个用 0 填充的大字符数组。我从套接字读取传入文件并将其内容放入缓冲区中。我无法写入包含所有“\0”的缓冲区,因此我分配了一个具有正确大小的新缓冲区并进行写入。我使用这种方法来做到这一点: in
我正在创建一个程序,通过命令行逐字符读取文本文件的内容。 NULL 值是自动插入的还是我必须手动将其添加到文本文件中? 最佳答案 文本文件在现代平台上不需要有终止符。 (在某些遗留平台上,他们确实有一
我正在使用 this library在 Go 中(在 OSX 上)与 Windows DNS 服务器交互。 运行以下代码片段时,出现有关空终止符的错误。 $ ~/go/bin/winrm-dns-c
我正在使用 fprintf 将字符串附加到文档中,这是我有疑问的行: fprintf(win, bff[i - 2] != '\n' && bff[i - 2] != '\r' ? "\nmultis
所以我正在制作每个人都喜欢的有趣游戏“石头、剪刀、布”,除了 while 循环在停止之前重复 3 次之外,我一切正常。嗯,它确实重复了 3 次并停止,但第二次和第三次重复变量没有改变。看一下代码并告诉
我对 llvm 还很陌生,只在这里完成了在线教程:http://llvm.org/docs/tutorial/LangImpl1.html现在我想做自己的小语言,但遇到了一些问题。我想解析这个: (d
我的 C 双向链表实现似乎无法正常工作。我担心这可能是由于我对 C 中指针的粗略了解(来自对解释语言的无知)。当我运行此代码时,似乎 print_list() 会永远运行,即使它应该被 next 字段
这是我第一次在这里发帖,如果我做错了什么,很抱歉。 我有一个 C 程序,它分配一个池,然后在内存中存储一个字符数组“Hello World”,然后检索它。我的主要方法中的代码行之一是: store
我正在尝试将包含字符串集合的文本文件读取到对象数组中,但输入有问题。我收到一个错误,该错误会转到此处的 istream *_Str = _Elem(); // add terminating n
我有一个 const char* 指向十六进制格式的数据,我需要找到我正在检查的数据的长度 NUL-terminator 但是当\x00 出现时它检测到它作为 NUL 终止符返回不正确的长度。 我该如
我在可执行文件中包含的文件中有一些大型字符串资源。我使用以下命令将它们包含在可执行文件中。 *.S 允许 GCC 调用 as 来生成目标文件,而无需任何特殊处理。 ;; ca_conf.S
如果你将一个 char 指针指向你刚刚 malloc() 的内存块,并在位置 [0]、[1]、[2]、[3]、...、[n] 处向它提供字符malloc 已经在末尾提供了空终止符“\0”,还是我必须在
有没有更好的方法将字符串 vector 转换为字符 vector ,字符串之间的终止符为零。 因此,如果我有一个包含以下字符串的 vector "test","my","string",那么我想接收一
所以,operator[]没有直接说s[s.size()]必须是s[s.size()-1]之后的字符在内存中。它的措辞似乎是为了避免做出这种说法。 但是s.data()指出s.data()+k ==
我使用 std::string 来保存任意二进制数据 blob。它以这种方式工作,但效率稍低,因为它需要将空终止符添加到 blob 的末尾。 (C++11 规范是 c_str() 和 data() 相
我是一名优秀的程序员,十分优秀!