场景
在C
语言中,我们经常会处理字符串,并定义字符串的最大长度宏定义,例如,STR_MAX_LEN
。
那么,这个最大长度,到底应该是带\0
后的长度,还是应该不带\0
后的长度呢?
以前总纠结于此,而且体现在代码中也用的比较混乱,并不能一以贯之!
现在来想,如果理清楚这里面的逻辑,就会觉得结论是非常自然的。
信息的长度就是信息的长度,它是第一个先蹦出来的概念,而将此信息用C
语言字符串进行处理,才涉及到补零多一个字节的问题。
在其它场合,可能并不涉及这样的问题,所以,你需要知道原始信息的最大长度多少。
另外,用STR_MAX_LEN + 1
去表达C
语言字符串缓冲区长度,相较于STR_MAX_LEN - 1
逆运算获得字符串最大长度,前一个会更直观点,和符合自然的逻辑 😃
结论
定义字符串最大长度,原则上应该是不携带\0
的长度。
如果您以C
语言的字符串语义去操作这些对象,那么缓冲区长度通常需要定义为STR_MAX_LEN + 1
,以足够容纳字符串结束符\0
。
#define NAME_STR_MAX_LEN (uint16_t)32
#define STR_BUFFER_LEN(STR_MAX_LEN) (STR_MAX_LEN + 1)
...
char szNameBuffer[STR_BUFFER_LEN(NAME_STR_MAX_LEN)];
...