我应该使用 sizeof(DEFINED_CHAR_ARRAY) 吗?

Shall I use sizeof(DEFINED_CHAR_ARRAY)?

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

我正在研究调制解调器响应解析器,我有这样的字符数组(字符串?)定义:

#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

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

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

//    else if ...

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

问题

我是不是在代码的其他地方搞砸了?

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

sizeof("Some text\n") 应该总是 return 10(如我所料)?

一个字符串文字,例如

"Some text"

总是包含一个隐含的 extra 字符,[=13=](或 NULL) 这反过来总是会导致可见字符的计数 +1.

所以

sizeof("Some text")   

"应该总是 return 9(如我所料)?" 不,它将是 10

sizeof("Some text\n")   

"应该总是 return 10(如我所料)?" 不,它将是 11

sizeof macro, counts all of the bytes that comprise any variable, such as a char array or a string literal,包括终止[=13=]NULL)字节。
请注意,此行为与 strlen() 函数形成对比,后者 使用 终止 NULL 字节来知道何时 停止 计数但不包括在总字节数中。

字符串文字的

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

https://godbolt.org/z/b84qPs