我应该使用sizeofDEFINED_CHAR_ARRAY吗?

问题描述

我不是ANSI C或C ++专家,如果这个问题很傻,请原谅我。

我正在使用调制解调器响应解析器,并且我有如下这样的char数组(字符串?)定义:

#define MODEM_AT_RESPONSE_OK "OK\n"
#define MODEM_AT_RESPONSE_CME_ERROR "+CME ERR"
#define MODEM_AT_RESPONSE_CMS_ERROR "+CMS ERR"
#define MODEM_AT_RESPONSE_ERROR "ERROR"
#define MODEM_AT_RESPONSE_PB_DONE "PB DONE"
#define MODEM_AT_RESPONSE_CALL_READY "CALL READY"
#define MODEM_AT_RESPONSE_CONNECT "CONNECT "

这就是我要使用它的方式(以避免硬编码的长度):

// received line starts with ERROR
if ( strncmp(MODEM_AT_RESPONSE_ERROR,(const char *)MODEM_UART_rxbuf,sizeof(MODEM_AT_RESPONSE_ERROR)) == 0) {
    (*async_task_complete_hnd)(ERROR,NULL);
} 

//    else if ...

MODEM_UART_rxbuf_clear(); // safe memset all bytes to 0

但是上面的代码在某些情况下不起作用。我这样更改了所有内容(从5sizeof(MODEM_AT_RESPONSE_ERROR),现在一切正常。

// received line starts with ERROR
if (strncmp(MODEM_AT_RESPONSE_ERROR,5) == 0
) {
    (*async_task_complete_hnd)(ERROR,NULL);
} 

//    else if ...

MODEM_UART_rxbuf_clear(); // safe memset all bytes to 0

问题

我在代码的其他地方弄乱了吗?

sizeof("Some text")应该总是返回9(如我所料)?

sizeof("Some text\n")应该总是返回10(如我所期望的那样)?

解决方法

字符串文字,例如

"Some text"

总是包含一个隐含的 extra 字符\0(或NULL) 依次将始终导致可见字符 +1 的计数。

所以

sizeof("Some text")   

“应该总是返回9(如我预期的那样吗?”)不,它将是10

sizeof("Some text\n")   

“应该总是返回10(按我的预期)吗?” 不,它将是11

sizeof macro对组成 any 变量(例如char arraystring literal)的所有字节的 all 进行计数,包括终止的\0NULL)字节。
请注意,此行为与strlen()函数相反,在函数中,它使用终止的NULL字节来知道何时停止进行计数,但不包括它在总字节数中。

, 字符串文字的

sizeof返回字符串文字的元素数,包括终止的空字符

https://godbolt.org/z/b84qPs

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...