kri*_*iss 33
通常,另一张海报写道:
char s[6] = {'s', 't', 'r', 'i', 'n', 'g'};
Run Code Online (Sandbox Code Playgroud)
或者如果你当前的C字符集是ASCII,这通常是正确的(今天的EBCDIC不多)
char s[6] = {115, 116, 114, 105, 110, 107};
Run Code Online (Sandbox Code Playgroud)
还有一种很大程度上被忽略的方式只适用于C(不是C++)
char s[6] = "string";
Run Code Online (Sandbox Code Playgroud)
如果数组大小太小而不能保持最后的0(但足够大以容纳常量字符串的所有其他字符),则不会复制最终的零,但它仍然是有效的C(但是无效的C++).
显然你也可以在运行时这样做:
char s[6];
s[0] = 's';
s[1] = 't';
s[2] = 'r';
s[3] = 'i';
s[4] = 'n';
s[5] = 'g';
Run Code Online (Sandbox Code Playgroud)
或(与上面的ASCII字符集相同)
char s[6];
s[0] = 115;
s[1] = 116;
s[2] = 114;
s[3] = 105;
s[4] = 110;
s[5] = 103;
Run Code Online (Sandbox Code Playgroud)
或者使用memcopy(或memmove或bcopy,但在这种情况下,这样做没有任何好处).
memcpy(c, "string", 6);
Run Code Online (Sandbox Code Playgroud)
或strncpy
strncpy(c, "string", 6);
Run Code Online (Sandbox Code Playgroud)
应该理解的是,C中没有字符串这样的东西(在C++中有字符串对象,但这完全是另一个故事).所谓的字符串只是char数组.甚至名字char都是误导性的,它不是一个字符,而只是一种数字类型.我们可能已经把它称为字节,但在过去,使用9位寄存器或类似的字节意味着有8位奇怪的硬件.
由于char通常用于存储字符代码,因此C设计者认为比在char中存储数字更简单.您可以在简单的引号之间放一个字母,编译器会理解它必须将此字符代码存储在char中.
我的意思是(例如)您不必这样做
char c = '\0';
Run Code Online (Sandbox Code Playgroud)
要在char中存储代码0,只需执行以下操作:
char c = 0;
Run Code Online (Sandbox Code Playgroud)
由于我们经常不得不使用一堆可变长度的字符,因此C设计师也选择了"字符串"的约定.只需将代码0放在文本应该结束的位置.顺便说一句,这种字符串表示有一个名称"零终止字符串",如果你在变量名的开头看到两个字母sz,通常意味着它的内容是一个零终止字符串.
"C sz strings"根本不是一个类型,只是一个正常的字符数组,比如一个int数组,但字符串操作函数(strcmp,strcpy,strcat,printf和许多其他函数)理解并使用0结束约定.这也意味着如果你有一个非零终止的char数组,你不应该调用任何这些函数,因为它可能会出错(或者你必须格外小心并使用名字中带有n个字母的函数,如strncpy).
这个惯例的最大问题是很多情况下效率低下.一个典型的例子:你想把一些东西放在一个0终止的字符串的末尾.如果你保持大小你可以跳到字符串的末尾,使用sz约定,你必须通过char检查它的char.处理编码的unicode等时会出现其他类型的问题.但是在创建C的时候,这个约定非常简单并完美地完成了工作.
如今,像"string"这样的双引号之间的字母不像过去那样是普通的char数组,而是const char *.这意味着指针指向的是一个不应该修改的常量(如果你想修改它必须先复制它),这是一件好事,因为它有助于在编译时检测许多编程错误.
C++ std::string不是NUL终止的.
PS:NULL是一个宏1.NUL是\0.不要混淆它们.
1:C.2.2.3宏NULL
宏NULL,在任何的定义<clocale>,<cstddef>,<cstdio>,<cstdlib>,<cstring>,
<ctime>,或<cwchar>,是实现定义的C++空指针在本国际标准(18.1)保持恒定.
终止null用于终止字符串.没有它,你需要一些其他的方法来确定它的长度.
您可以使用预定义的长度:
char s[6] = {'s','t','r','i','n','g'};
Run Code Online (Sandbox Code Playgroud)
您可以模拟pascal样式的字符串:
unsigned char s[7] = {6, 's','t','r','i','n','g'};
Run Code Online (Sandbox Code Playgroud)
你可以使用(因为你对std :: string不感兴趣).std::string(在C++中).
优选地,您将使用一些处理unicode的预先存在的技术,或者至少理解字符串编码(即,wchar.h).
并且评论:如果你把它放在一个打算在实际计算机上运行的程序中,你可以考虑输入你自己的"字符串".如果您不小心尝试将其传递给期望C样式字符串的函数,这将鼓励您的编译器进行barf.
typedef struct {
char[10] characters;
} ThisIsNotACString;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
32585 次 |
| 最近记录: |