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

问题描述 投票:1回答:2

抱歉,如果我的某些术语有误,我一直在阅读几页,并没有看到明确的答案,只是想确定。

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

如果我需要制作一个char [X}数组,最多可以容纳10个用户输入的字符(例如最大字可能是“applejacks”),那么这个数组的X大小是10还是11?

c arrays
2个回答
4
投票

这取决于你的目标是什么:

存储10个chars数组:

char someChars[10];

存储一串最大值10 chars:

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

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


2
投票

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

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

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.