Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 定义一个在结尾没有null终止字符(\0)的字符串_C++_C - Fatal编程技术网

C++ 定义一个在结尾没有null终止字符(\0)的字符串

C++ 定义一个在结尾没有null终止字符(\0)的字符串,c++,c,C++,C,在C/C++中,有哪些不同的方法可以定义一个末尾没有null终止字符(\0)的字符串 > >编辑:只对字符数组感兴趣,而不是在STL字符串中。< P> C++中,你可以使用类而不处理空字符。使用STD::String。< /P> 存储字符串的方法有几十种,但使用库通常比创建自己的库要好。我相信我们都能想出很多不带空终止符的奇怪方法:)。C++std::strings不是以空终止的 另外:NULL是一个宏1NUL是\0。不要把它们混在一起 1:C.2.2.3宏为空 宏NULL,在任何,,,,中定

在C/C++中,有哪些不同的方法可以定义一个末尾没有null终止字符(\0)的字符串

<> > >编辑:只对字符数组感兴趣,而不是在STL字符串中。

< P> C++中,你可以使用类而不处理空字符。

使用STD::String。< /P>


存储字符串的方法有几十种,但使用库通常比创建自己的库要好。我相信我们都能想出很多不带空终止符的奇怪方法:)。

C++
std::string
s不是以空终止的

另外:
NULL
是一个宏1
NUL
\0
。不要把它们混在一起

1:C.2.2.3宏为空

宏NULL,在任何
中定义, <代码> <代码>或<代码> <代码>,是一个在国际上定义的C++空指针常数。
标准(18.1)。

在C中,通常不会有更简单的解决方案。您可能会像pascal那样,将字符串的长度放在第一个字符中,但这有点麻烦,会将字符串长度限制为适合第一个字符空间的整数大小。 在C++中,我肯定会使用可以通过

访问的STD::String类。
#include <string>
#包括

作为一个常用的库,这几乎肯定比滚动自己的字符串类更可靠。

空终止的原因是字符串的处理程序可以确定它的长度。如果不使用空终止符,则需要通过单独的参数/变量或作为字符串的一部分传递字符串长度。否则,您可以使用另一个delimeter,只要它不在字符串本身中使用


老实说,我不太理解您的问题,或者它是否真的是一个问题。

终止null用于终止字符串。如果没有它,您需要其他方法来确定它的长度

可以使用预定义的长度:

char s[6] = {'s','t','r','i','n','g'};
您可以模拟pascal样式的字符串:

unsigned char s[7] = {6, 's','t','r','i','n','g'};
您可以使用
std::string
(在C++中)。(因为您对std::string不感兴趣)

您最好使用一些预先存在的处理unicode的技术,或者至少理解字符串编码(即,
wchar.h

和一个评论:如果你把它放在一个程序上,它是在一个实际的计算机上运行的,你可以考虑使用你自己的“字符串”。如果您不小心试图将它传递给一个需要C样式字符串的函数,这将鼓励您的编译器呕吐

typedef struct {
    char[10] characters;
} ThisIsNotACString;

即使是
字符串
类也会将其存储为null。如果出于某种原因,您绝对不希望在内存中的字符串末尾出现空字符,那么您必须手动创建一个字符块,然后自己填写


我个人想不出任何现实的场景来解释为什么要这样做,因为空字符是字符串结束的信号。如果您也在存储字符串的长度,那么我猜您已经节省了一个字节,而不管变量的大小如何(可能是4个字节),并且可以更快地访问所述字符串的长度。

通常如另一张海报所写:

char s[6] = {'s', 't', 'r', 'i', 'n', 'g'};
或者,如果您当前的C字符集是ASCII,这通常是正确的(今天没有多少EBCDIC)

还有一种只在C(而不是C++)中工作的方式,在很大程度上被忽略了

如果数组大小太小,无法容纳最后的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字符集上的注释相同)

或者使用memcopy(或者memmove,或者bcopy,但在这种情况下这样做没有好处)

还是strncpy

strncpy(c, "string", 6);
应该理解的是C中没有一个字符串(C++中有字符串对象,但这完全是另一个故事)。所谓的字符串就是字符数组。即使名称char也有误导性,它不是char,只是一种数字类型。我们可能会称它为字节,但在旧时代,使用9位寄存器或诸如此类的奇怪硬件,字节意味着8位

由于字符通常用于存储字符代码,C设计人员想到了一种比在字符中存储数字更简单的方法。您可以在简单的引号之间放置一个字母,编译器就会明白它必须将此字符代码存储在char中

我的意思是(举例来说)你不必这么做

char c = '\0';
要将代码0存储在字符中,只需执行以下操作:

char c = 0;
由于我们经常需要处理一组长度可变的字符,C设计人员还为“字符串”选择了一种约定。只需将代码0放在文本应该结束的位置。顺便说一句,这种字符串表示形式有一个名称“以零结尾的字符串”,如果在变量名的开头看到两个字母sz,通常意味着它的内容是以零结尾的字符串

“CSZ字符串”根本不是一种类型,只是一个字符数组,与int数组一样普通,但是字符串操作函数(strcmp、strcpy、strcat、printf和许多其他函数)理解并使用0结尾约定。这也意味着,如果您的char数组不是以零结尾的,那么您不应该调用这些函数中的任何一个,因为它们可能会出错(或者您必须格外小心,使用名称中带有n个字母的函数,如strncpy)

这一惯例的最大问题是,在许多情况下,它效率低下。一个典型的例子是:您想在以0结尾的字符串的末尾放一些东西。如果您保持了大小,您可以在字符串末尾跳转,使用sz约定,您必须逐字符检查它。处理编码的UNIC时会出现其他类型的问题
memcpy(c, "string", 6);
strncpy(c, "string", 6);
char c = '\0';
char c = 0;