在Gracenote GNSDK脚本中转义双引号

时间:2016-04-21 10:29:18

标签: c escaping double-quotes gracenote

我使用带有SDK Gracenote(GNSDK)的脚本来识别文件(指纹)。

脚本正常工作,我只想转义变量中的双引号。

我发现了这个功能:

void str_replace(char *target, const char *needle, const char *replacement)
{
    char buffer[1024] = { 0 };
    char *insert_point = &buffer[0];
    const char *tmp = target;
    size_t needle_len = strlen(needle);
    size_t repl_len = strlen(replacement);

    while (1) {
        const char *p = strstr(tmp, needle);

        // walked past last occurrence of needle; copy remaining part
        if (p == NULL) {
            strcpy(insert_point, tmp);
            break;
        }

        // copy part before needle
        memcpy(insert_point, tmp, p - tmp);
        insert_point += p - tmp;

        // copy replacement string
        memcpy(insert_point, replacement, repl_len);
        insert_point += repl_len;

        // adjust pointers, move on
        tmp = p + needle_len;
    }

    // write altered string back to target
    strcpy(target, buffer);
}

我想在这里使用,我的印象是变量类型不同但我不知道如何(开头的gnsdk_cstr_t和函数str_replace中的char)。这是代码的一部分或想要转义“VALUE”的双引号:

static void
_display_track_gdo(
    gnsdk_gdo_handle_t track_gdo
    )
{
    gnsdk_error_t      error = GNSDK_SUCCESS;
    gnsdk_gdo_handle_t title_gdo = GNSDK_NULL;
    gnsdk_cstr_t       value = GNSDK_NULL;


    /* Track Title */
    error = gnsdk_manager_gdo_child_get(track_gdo, GNSDK_GDO_CHILD_TITLE_OFFICIAL, 1, &title_gdo);
    if (GNSDK_SUCCESS == error)
    {
        error = gnsdk_manager_gdo_value_get(title_gdo, GNSDK_GDO_VALUE_DISPLAY, 1, &value);
        if (GNSDK_SUCCESS == error)
        {

            char s[1024] = value;       
            str_replace(s, "\"", "\\\"");
            printf("\"%s\": \"%s\"", "track", s);
        }
        else
        {
            _display_last_error(__LINE__);
        }
        gnsdk_manager_gdo_release(title_gdo);
    }
    else
    {
        _display_last_error(__LINE__);
    }

}

在编译期间,错误是:

main.c: In function '_display_track_gdo':
main.c:756:4: error: invalid initializer
     char s[1024] = value;

如何解决我的问题?或者使用另一种方法来逃避双引号?

提前谢谢。

亲切。

PS:我不太了解语言C,所以我有可能在如何编码方面犯错误。

1 个答案:

答案 0 :(得分:1)

value的类型为gnsdk_cstr_t,您无法使用它来初始化char数组。使用库提供的API,您可以将其复制或转换为char数组。但是你不能分配给一个数组。

查看库的来源,事实上,gnsdk_cstr_t定义为typedef const gnsdk_char_t* gnsdk_cstr_t;gnsdk_char_t定义为typedef char gnsdk_char_t;,这意味着gnsdk_cstr_t与以null结尾的字符串相同,只能在其上调用标准字符串函数:

char s[1024];
strcpy(s, value);

参考:

https://github.com/tingled/jambox/blob/master/rpi_gnsdk/include/gnsdk/gnsdk_defines.h