在C/C++中,有哪些定义字符串并且不在末尾添加空字符(\0)的方法?
编辑:我只关心字符数组,而不是STL字符串。
在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";
char s[6];
s[0] = 's';
s[1] = 't';
s[2] = 'r';
s[3] = 'i';
s[4] = 'n';
s[5] = 'g';
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类型,而只是一种数字类型。我们本可以称之为byte,但在早期,使用9位寄存器等奇怪硬件时,byte意味着8个比特。
由于char通常用于存储字符编码,C语言设计者想出了一种比将数字存储在char中更简单的方法。你可以在简单引号之间放置一个字母,编译器会理解它必须将此字符编码存储在char中。
我的意思是(例如),你不必做以下操作
char c = '\0';
要将代码0存储在字符中,只需执行以下操作:
char c = 0;
assert( sizeof(const char*) != sizeof("Hi there!") )
。 - David Rodríguez - dribeas终止符用于终止字符串。如果没有它,您需要其他方法来确定其长度。
您可以使用预定义的长度:
char s[6] = {'s','t','r','i','n','g'};
unsigned char s[7] = {6, 's','t','r','i','n','g'};
您可以使用C++中的(因为您对std :: string不感兴趣)。std::string
。
最好使用一些预先存在的处理unicode的技术,或者至少了解字符串编码(即wchar.h
)。
另外一条建议:如果您将此放入旨在在实际计算机上运行的程序中,可以考虑typedef您自己的“字符串”。这将鼓励您的编译器,如果您意外地尝试将其传递给期望C风格字符串的函数,则会抛出错误。
typedef struct {
char[10] characters;
} ThisIsNotACString;
char s[3] = "abc";
的讨论... - Tony DelroyC++的std::string
不是以NUL结尾的。
P.S:NULL
是一个宏1。NUL
是\0
。不要混淆。
1:C.2.2.3宏NULL
在任何<clocale>
、<cstddef>
、<cstdio>
、<cstdlib>
、<cstring>
、<ctime>
或<cwchar>
中定义的宏NULL是这个国际标准(18.1)中实现定义的C++空指针常量。
(void*)0
,而在C++中仅为0
。请注意,区别在于类型,而不是值。 - David Rodríguez - dribeas只是为了完整起见,彻底解决这个问题。
向量<字符>
#include <string>
使用 std::string。
有数十种其他存储字符串的方法,但使用库通常比自己制作更好。我相信我们都可以想出很多没有空终止符的疯狂字符串方法 :).
NULL 终止的原因是为了让字符串的处理程序可以确定其长度。如果您不使用 NULL 终止符,您需要通过单独的参数/变量或作为字符串的一部分传递字符串的长度。否则,您可以使用另一个分隔符,只要它不在字符串本身中使用即可。
老实说,我不太理解您的问题,或者它是否实际上是一个问题。
即使是 string
类也会将其存储为 null。如果您绝对不希望在内存中的字符串末尾有 null 字符,那么您必须手动创建一块字符块,并自行填充它。
我个人想不出任何实际情况,需要这样做,因为 null 字符是表示字符串结束的信号。如果您也要存储字符串的长度,那么我猜您已经以某种方式保存了一个字节,代价是变量大小(可能是 4 个字节),并且获得了更快访问所述字符串长度的速度。