我是否需要在字符串数组中包含终止字符的空间?

时间:2018-05-26 07:57:14

标签: c arrays

如果我有一些错误的术语,我已经阅读了几页并且没有看到明确的答案并且只是想确定。

如果我想制作一个10个字符长的数组来构建一个字符串,我是否需要将其大小设置为10或11?我不知道在编译之前输入到数组中的单词是什么(因为它来自用户输入),只是它最多有10个字符。从我读过的内容中,需要在数组末尾有一个\ 0终止字符的空间,所以我的问题是:

如果我需要制作一个最多可容纳10个用户输入字符的char [X}数组(例如,最大字数可以是" applejacks"),那么X的大小为10或11阵列

2 个答案:

答案 0 :(得分:4)

这取决于你的目标:

存储10个char的数组:

char someChars[10];

存储一串最大值10 char s:

char myString[11]; /* 10 + '\0' */

请注意,字符串不是C语言类型。

答案 1 :(得分:2)

实际上,在任何C string的最后一个字符之后,您需要一个额外的字节用于强制性 NUL 字节。请记住,C字符串实际上并不存在,除非作为非 NUL 字节数组的约定(每个类型char)由一个 NUL 字节,许多string related functions(例如strlenstrchr)期望该约定成立。此外,屏幕上显示的单个字符可能需要多个字节,具体取决于character encoding。 C11标准(读取n1570)不要求任何特定编码(但是,§5.2.1对字符集施加了一些约束。)

顺便说一下,如果(因为你应该,自2018年以来UTF-8 is everywhere)你使用UTF-8Unicode个字符的编码,在极少数情况下,你需要41个字节才能获得UTF中的10个Unicode字符-8(因为一些Unicode字符 - 例如即U + 104D0 OSAGE CAPITAL LETTER KHA-在UTF-8中需要4个字节\360\220\223\220。例如,我的姓氏用俄语拼写Старынкевич,即11 cyrillic个字母,但UTF-8中有22个字节(+ 1表示终止 NUL

最后,在实践中,大多数字符串都以某种方式aligned(通常是单词),因此通常 - 但并非总是 - 使用四个字节倍数的char数组是有意义的。

请注意,char关键字令人困惑(由于历史原因,最初C在上个世纪使用了一些ASCII编码,并且还使用EBCDIC进行了实施;你需要把它想象成一个“字节”(在一些奇怪的C实现上,它甚至可能没有8位),而不是一个可显示的字符字形。

今天,你不能指望(在专业软件中)每一封信都是拉丁文。另请阅读有关Internationalization & Localization软件的信息。