问题描述
我不是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
但是上面的代码在某些情况下不起作用。我这样更改了所有内容(从5
到sizeof(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 array或string literal)的所有字节的 all 进行计数,包括终止的\0
(NULL
)字节。
请注意,此行为与strlen()函数相反,在函数中,它使用终止的NULL
字节来知道何时停止进行计数,但不包括它在总字节数中。
sizeof
返回字符串文字的元素数,包括终止的空字符