使用void *更改字符

时间:2018-07-16 09:02:35

标签: c

我正在尝试从Wi-Fi模块解析mac地址,但是遇到了一些麻烦。 当我调用wifi_get_mac()时,它在解析状态下进入on_get_mac_result_line并在sscanf之后获得mac地址,但是回到{{ 1}},mac只是随机的东西。

wifi_get_mac

我知道这样做可以得到rssi

static void* wifi_process_line_data;
static void (*wifi_process_line_func)(void* data, const char* line, int length);

static void on_get_mac_result_line(void* data, const char* line, int length)
{
    if (wifi_state != STATE_IDLE) {
        char mac[length];
        char *p = mac;
        if (sscanf(line, "%17s", mac) == 1) {
            *(char*) data = mac;
        }
    }
}

char* wifi_get_mac(void){
    static char mac[17];
    char *p = mac;
    wifi_process_line_data = p;
    wifi_process_line_func = on_get_mac_result_line;
    if (wifi_perform_s2w_command("AT+NMAC=?\n") && mac[0] != '\0') {
        return '\0';
    }
    return mac;
}

2 个答案:

答案 0 :(得分:3)

char mac[length];对于on_get_mac_result_line函数而言是本地的。不应尝试在该功能之外进行访问。

您必须将整个char数组复制到data目标中,以使结果可用于调用函数(wifi_get_mac)。例如。通过使用strncpy

strncpy((char*) data, mac, 17);

答案 1 :(得分:2)

该行:

*(char*) data = mac;

试图将char*分配给char-在GCC中会产生以下警告:

    warning: assignment makes integer from pointer without a cast [-Wint-conversion]

您应该有类似的东西,并且永远不要忽略警告。

这里您需要做的是将mac中生成的字符串复制到调用方data提供的缓冲区中:

static void on_get_mac_result_line( void* data, const char* line, int length )
{
    if( wifi_state != STATE_IDLE ) 
    {
        char mac[length] ;

        if( sscanf_s( line, "%17s", mac, length ) == 1 ) 
        {
            strcpy( data, mac) ;
        }
    }
}

您还应该采取措施确保length足以防止超支,例如,您可以检查length至少为18,或者像我一样使用sscanf_s以上。

请注意,原始实现中的p未使用,没有任何用途。