global definierter string wird verändert
-
hi,
ich arbeite grad an einem programm, dass mir die metadata-info von einem shoutcast stream parsed. es funktioniert so weit auch ganz gut, nur meine globalen variablen machen mir etwas zu schaffen.
ich hab drei globale variable deklariert (2 strings, 1 integer).
in meinen funktionen size_t hdrprocess und size_t stream_process werden diese mit informationen vollgepackt ... lass ich mir innehalb dieser funktionen mit printf den wert ausgeben ist alles wie es sein soll, wenn ich jedoch nach beendeter transaktion mit dem server die werte in meiner int main wiedergeben lassen will, kommt nur irgendein schrott bei raus.
der integer bleibt so wie er sein soll, nur die strings werden mist.#include <stdio.h> #include <curl/curl.h> #include <string.h> #include <stdlib.h> int metaint; static char *station; static char *stationinfo; /* Function to get the song title parsed */ size_t stream_process(void *buffer, size_t size, size_t nmemb, void *userp) { int loop; char *metadata, *token; for (loop=0;loop<=nmemb*size;loop++){ metadata = ((buffer)+loop); /* the trick with counting the bytes till bytes = metaint * never really worked out....or I never really figured it out ;) * so we just search for the string 'StreamTitle' * and then we parse the Title into our info-variable * might be more cpu-intense, but it actually works! */ if (!strncmp(metadata, "StreamTitle", 11)){ char data[256]; strncpy(data, metadata+12, 256); token = strtok(data, "'"); stationinfo = (char *) token; printf("%s\n", stationinfo); } } return size*nmemb; } /* headerprocessing: */ size_t hdrprocess( void *ptr, size_t size, size_t nmemb, void *stream){ int loop=0; char *data, *token, info[100]; data = (char *) ptr; if(!strncmp(data, "icy-name:", 9)) { printf("Got Servername!\n"); token = strtok(data, " "); while((token = strtok(0, " "))){ if(loop == 0) { strcpy(info, token); loop++; } else { strcat (info, " "); strcat (info, token); } } station = (char *)info; printf("Servername: %s\n", station); } if(!strncmp(data, "icy-metaint:", 12)) { printf("Got metaint-data!\n"); token = strtok(data, " "); token = strtok(0, " "); if (token) { metaint = atoi(token); } else { metaint = 0; } printf("metaint = %i\n", metaint); } return size*nmemb; /* we must return the amount of bytes processed */ } int main (int argc, char **argv){ char *easyhandle; char *headerdata; char *URL; struct curl_slist *headerlist=NULL; if(argc<2){ printf("\n\nUSAGE:\n\n"); printf("%s [URL]\n\n", argv[0]); return 0; } URL = argv[1]; /* CURL initialization*/ curl_global_init(CURL_GLOBAL_ALL); easyhandle = curl_easy_init(); /* append 'Icy-MetaData:1' to the header, bc we want the metadata*/ headerlist = curl_slist_append(headerlist, "Icy-MetaData:1"); headerlist = curl_slist_append(headerlist, "ICY 200 OK"); curl_easy_setopt(easyhandle, CURLOPT_HTTPHEADER, headerlist); /* Where are we connecting to?*/ curl_easy_setopt(easyhandle, CURLOPT_URL, URL); curl_easy_setopt(easyhandle, CURLOPT_TIMEOUT, 2); curl_easy_setopt(easyhandle, CURLOPT_HTTP200ALIASES, headerlist); curl_easy_setopt(easyhandle, CURLOPT_HEADERFUNCTION, hdrprocess); curl_easy_setopt(easyhandle, CURLOPT_WRITEHEADER, headerdata); /* Don't send data recieved to stdout --> send to processing-function instead*/ curl_easy_setopt(easyhandle, CURLOPT_WRITEFUNCTION, stream_process); curl_easy_perform(easyhandle); /*wo sind die werte meiner globalen variablen??? */ printf("%s\n", station); /*es wird irgendein mist ausgegeben*/ printf("%s\n", stationinfo);/*hier auch*/ printf("%i\n", metaint); /*hier ist alles ok*/ curl_slist_free_all(headerlist); /* free the list again */ curl_global_cleanup(); return 0; }
hat irgendjemand ne idee, das da falsch läuft?
kompiliert wird ohne probleme. (mit gcc unter cygwin oder auch linux)danke schonmal im voraus.
PS ich denk mal, das programm ist sehr liederlich geschrieben (was den c stil betrifft), aber ich bin weit weg vom PRO(grammierer) und brauchte was, was meinen anforderungen entspricht (soll später mal, wenns richtig funzt, ein plugin für mein lcd-display werden [lcd4linux])...konnte sowas aber weit und breit nicht finden
-
char data[256]; bzw. info[100]; ist doch nur ne lokale Variable, die nach Blockende wieder weg ist. Du kannst nicht einfach globale Zeiger auf die Variable zeigen lassen und erwarten, dass die Strings immer noch da sind. Mach deine globalen Variablen zu char Arrays.
-
danke, das funktioniert....naja anfängerfehler ^^
-
Hehe,
das war acuh mal ein Anfängerfehler von mir:-)