在 Gracenote GNSDK 脚本中转义双引号

Escape double quotes in Gracenote GNSDK script

我使用带有 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语言了解不多,可能是我写错了。

valuegnsdk_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 和空结尾的字符串一样,可以调用标准的字符串函数:

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

参考:

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