我应该使用 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 字符串文字的元素数,包括终止空字符
我不是 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 字符串文字的元素数,包括终止空字符