我应该使用sizeof(定义字符数组)吗? 我不是ANSI C或C++专家,请原谅我这个问题很傻。< /P>

我应该使用sizeof(定义字符数组)吗? 我不是ANSI C或C++专家,请原谅我这个问题很傻。< /P>,c,string,sizeof,C,String,Sizeof,我在做调制解调器响应解析器,我有字符数组字符串?定义如下: #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 MO

我在做调制解调器响应解析器,我有字符数组字符串?定义如下:

#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,而不是sizeofMODEM_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
问题:

我把代码中的其他地方弄糟了吗

sizeofSome文本应该总是像我预期的那样返回9


sizeofSome text\n应该像我预期的那样始终返回10?

字符串文本,例如

"Some text"
始终包含一个隐式额外字符,\0或NULL 这反过来将始终导致可见字符计数+1

所以

应该总是像我期望的那样返回9吗?不,十点

sizeof("Some text\n")   
应该总是像我期望的那样返回10吗?不,是11点

对组成任何变量(如a或a)的所有字节进行计数,包括终止的\0空字节。
请注意,此行为与函数相反,函数使用终止空字节来知道何时停止计数,但不将其包括在总字节计数中

"Some text"
始终包含一个隐式额外字符,\0或NULL 这反过来将始终导致可见字符计数+1

所以

应该总是像我期望的那样返回9吗?不,十点

sizeof("Some text\n")   
应该总是像我期望的那样返回10吗?不,是11点

对组成任何变量(如a或a)的所有字节进行计数,包括终止的\0空字节。 请注意,此行为与函数相反,函数使用终止空字节来知道何时停止计数,但不将其包括在总字节计数中。

string literal的sizeof返回包含终止空字符的string literal的元素数

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


sizeofMODEM_AT_RESPONSE_ERROR是指针的大小,而不是字符串的长度,它是strlenMODEM_AT_RESPONSE_ERROR@WeatherVane不,它应该是数组的大小。sizeofSome text是10而不是9,您忘记了计算空终止符。和sizeofSome text\n==11。您可以只打印返回值的大小。@P_uj_u_u谢谢您,但已经说过了,我自己检查过了。在数组中使用sizeof时仍应小心,它可能是上下文中的指针。是的,您错过了以下对话框。sizeofMODEM_AT_RESPONSE_错误是指针的大小,而不是字符串的长度,它是strlenMODEM_AT_RESPONSE_ERROR@WeatherVane不,它应该是数组的大小。sizeofSome text是10而不是9,您忘了计算空终止符。和sizeofSome text\n==11。您可以只打印返回值的大小。@P_uj_u_u谢谢您,但已经说过了,我自己检查过了。在数组中使用sizeof时仍然要小心,因为它可能是上下文中的指针。