- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
在 C/C++ 中有哪些不同的方法来定义一个结尾没有空终止字符(\0)的字符串?
编辑:我只对字符数组感兴趣,而不对 STL 字符串感兴趣。
最佳答案
通常正如另一张海报所写:
char s[6] = {'s', 't', 'r', 'i', 'n', 'g'};
或者如果你当前的 C 字符集是 ASCII,这通常是正确的(今天没有多少 EBCDIC)
char s[6] = {115, 116, 114, 105, 110, 107};
还有一种在很大程度上被忽略的方式只适用于 C(不是 C++)
char s[6] = "string";
如果数组大小太小而无法容纳最后的 0(但大到足以容纳常量字符串的所有其他字符),则不会复制最后的 0,但它仍然是有效的 C(但无效的 C++) .
显然你也可以在运行时这样做:
char s[6];
s[0] = 's';
s[1] = 't';
s[2] = 'r';
s[3] = 'i';
s[4] = 'n';
s[5] = 'g';
或(与上述 ASCII 字符集的注释相同)
char s[6];
s[0] = 115;
s[1] = 116;
s[2] = 114;
s[3] = 105;
s[4] = 110;
s[5] = 103;
或使用 memcopy(或 memmove 或 bcopy,但在这种情况下这样做没有任何好处)。
memcpy(c, "string", 6);
或strncpy
strncpy(c, "string", 6);
应该理解的是,在 C 中没有字符串这样的东西(在 C++ 中有字符串对象,但这完全是另一回事)。所谓的字符串只是字符数组。甚至 char 的名称也具有误导性,它不是 char 而是一种数字类型。我们或许可以将其称为字节,但在过去,使用 9 位寄存器等奇怪的硬件,字节意味着 8 位。
由于 char 经常用于存储字符代码,C 设计人员想到了一种比在 char 中存储数字更简单的方法。你可以在简单的引号之间放一个字母,编译器会理解它必须将此字符代码存储在字符中。
我的意思是(例如)你不必这样做
char c = '\0';
要将代码 0 存储在 char 中,只需:
char c = 0;
由于我们经常需要处理一堆可变长度的字符,C 设计者还选择了“字符串”的约定。只需将代码 0 放在文本应该结束的地方。顺便说一句,这种字符串表示形式有一个名称“零终止字符串”,如果您在变量名的开头看到两个字母 sz,通常意味着它的内容是一个以零结尾的字符串。
“C sz strings”根本不是一种类型,只是一个字符数组,就像一个 int 数组一样,但是字符串操作函数(strcmp、strcpy、strcat、printf 和许多其他函数)可以理解并使用 0 结尾约定。这也意味着如果你有一个不是零终止的 char 数组,你不应该调用这些函数中的任何一个,因为它可能会做错事(或者你必须格外小心并使用带有 n 名称中的字母,例如 strncpy)。
这种约定的最大问题是在很多情况下它效率低下。一个典型的例子:你想在一个以 0 结尾的字符串的末尾放一些东西。如果你保持了大小,你可以在字符串的末尾跳转,使用 sz 约定,你必须逐个字符地检查它。处理编码的 unicode 等时会出现其他类型的问题。但是在创建 C 时,这个约定非常简单,并且完美地完成了这项工作。
如今,像“string”这样的双引号之间的字母不再像过去那样是纯字符数组,而是const char *
。这意味着指针指向的是一个不应该被修改的常量(如果你想修改它,你必须先复制它),这是一件好事,因为它有助于在编译时检测到许多编程错误。
关于c++ - 定义一个结尾没有空终止字符(\0)的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3828307/
在complier.h中有一个宏定义如下: # define __cond_lock(x,c) ((c) ? ({ __acquire(x); 1; }) : 0) 但是这里我有一个问题,就是哪里
curl_easy_setopt 的选项在哪里?定义?我试图寻找 CURLOPT_VERBOSE 和其他一些整数值,但这些似乎没有在 curl.h 中明确定义。 最佳答案 第 792 行: #ifde
我确实有一个如下所示的类(class): //.h file class __declspec(dllimport) MyClass { public: //stuff pri
作者: zhuwenzhuang, 2024.05.08. 阅读前假设读者熟悉数据库使用,了解 SQL 的语法和关系算子的大概含义, 能通过 EXPLAIN 命令查看数据库执行计划. 0 前言
我似乎无法找到是否可以声明一个 header 对象以便在响应 header 中重用它,有一些示例定义了响应模式的对象,但它不会转置为响应 header 。我只设法制作了一个可重用的响应对象,如下所示:
css 选择器 * + * 实际上是什么意思?当您执行检查元素时,您可以在谷歌浏览器的控制台中看到它。在我看来,这似乎是对 "Every second child"应用一种风格,但仍然想确定。谁能帮我
我试图弄清楚基本的IO Haskell 函数是定义好的,所以我使用了this reference我到了putChar函数定义: putChar :: Char -> IO () putChar
我得到了一个自动生成的文件,该文件定义了程序集属性,我正在尝试理解内容。 [assembly: global::System.Runtime.Versioning.TargetFrameworkAtt
This文档演示了如何检查变量是否先前已在 gnuplot 脚本中定义。 文档中的示例: a = 10 if (exists("a")) print "a is defined" if (!exist
好吧,这是一个相当基本的问题:我正在关注 SICP 视频,我对 define、let 和 之间的区别有点困惑设置!. 1) 根据 Sussman 在视频中的说法,define 只允许为变量附加一个值一
我一直在尝试定义一个包含只能具有以下三个值之一的字段的 XSD: 绿色 红色 蓝色 本质上,我想在架构级别定义严格的枚举。 我的第一次尝试似乎是错误的,我不确定修复它的“正确”方法。
有人可以定义“POCO”到底是什么意思吗?我越来越频繁地遇到这个术语,我想知道它是否仅与普通类有关还是意味着更多? 最佳答案 “普通旧式 C# 对象” 只是一个普通的类,没有描述基础结构问题或域对象不
在我经常看到的一些django模型中 myfield = models.CharField(_('myfield')) class_name = models.CharField(_('Type'),
每当 BOOL 数据类型不容易预定义时,我都会使用以下定义进行 boolean 运算, typedef unsigned char BOOL; (由于内存使用)。 我意识到出于性能原因,使用本地总线宽
l_ABC_BEANVector = utilRemote.fnGetVector("ABC_COVBEANVector"); 编码的含义是什么?任何帮助,我真的很感激。谢谢 最佳答案 唯一可以肯定地
我正在使用 javacc 开发一个项目,我遇到问题并需要一些帮助,我的文件中有这样的内容: STRING COPYRIGHT (C) 2003, 2004 SYNOPSYS, INC.; 我为单词 S
我想弄清楚基本的 IO定义了 Haskell 函数,所以我使用了 this reference然后我到了 putChar函数定义: putChar :: Char -> IO () putCha
我在具体类中使用 @property 定义 getter 时遇到问题。这是Python代码: from abc import ABCMeta, abstractproperty class abstr
我正在为大学用 C 语言编写一个小游戏,但我陷入了困境。我(在头文件中)有这个结构: typedef struct{ game_element field[MAX_ROWS][MAX_COLU
我一直在 .l 文件中创建标记定义。由于数据集数量庞大,它变得有点乏味。有没有办法读取文件中的所有单词,例如包含所有名词的 noun.txt 并给所有名词一个标记。 基本上,我想自动化这部分: %%
我是一名优秀的程序员,十分优秀!