2016-04-21 10 views
0

Ich benutze ein Skript mit dem SDK Gracenote (GNSDK) für die Audioerkennung einer Datei (Fingerabdruck).Escape doppelte Anführungszeichen in Gracenote GNSDK Skript

Das Skript funktioniert korrekt, ich möchte nur die Anführungszeichen in einer Variablen zu entkommen.

ich diese Funktion gefunden:

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); 
} 

ich hier verwenden wollen habe ich den Eindruck, dass der Variablentyp unterschiedlich ist, aber ich weiß nicht, wie (gnsdk_cstr_t am Anfang und Saibling in Funktion str_replace). Hier ist der Teil des Codes oder wollen die doppelten Anführungszeichen von „VALUE“ zu entkommen:

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__); 
    } 

} 

Während der Kompilierung der Fehler ist:

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

Wie kann ich mein Problem zu lösen? Oder verwenden Sie eine andere Methode, um die doppelten Anführungszeichen zu umgehen?

Vielen Dank im Voraus.

Herzlich.

PS: Ich weiß nicht viel die Sprache C, also ist es möglich, dass ich Fehler beim Code machen.

Antwort

1

value ist vom Typ gnsdk_cstr_t, Sie können damit kein char-Array initialisieren. Verwenden Sie die von der Bibliothek bereitgestellte API, wahrscheinlich können Sie sie in ein char-Array kopieren oder konvertieren. Aber Sie können einem Array nicht zuweisen.

die Quelle der Bibliothek Suche in der Tat ist gnsdk_cstr_t als typedef const gnsdk_char_t* gnsdk_cstr_t; definiert und gnsdk_char_t als typedef char gnsdk_char_t; definiert ist, bedeutet dies, gnsdk_cstr_t die gleiche wie nullterminierten Strings ist, kann auf sie Standard-String-Funktionen rufen Sie einfach an:

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

Referenz:

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

+0

Gültig Punkt! Aber das ist mehr ein Kommentar als eine Antwort. – sjsam

+0

Anscheinend funktioniert es gut, aber ich weiß noch nicht, ob meine Charaktere entkommen sind, weil ich andere Sorgen habe. Ich habe dies: char s [1024]; strcmp (s, Wert); \t \t \t str_replace (s, "\" "," \\\ ""); printf ("\"% s \ ": \"% s \ ",", "album", s); Nun werden meine Informationen in der Konsole mit Sonderzeichen angezeigt: {"retour": [{"artist": " i", "album": " i", "track": ""}] , "line": {"pos": "0"}} –

+0

@Vincentleveque sorry Ich habe fälschlicherweise 'strcmp' eingegeben, es sollte' strcpy' sein, weil wir Werte in das char-Array 's' kopieren. Wechseln Sie zu 'strcpy (s, value)' und versuchen Sie es erneut. – fluter

Verwandte Themen