Visualizzazione dei risultati da 1 a 4 su 4
  1. #1

    [C] estrapolare sottostringhe

    Ciao ragazzi.

    Ho delle stringhe nella forma:

    campo1=valore1&campo2=valore2&campo3=valore3 ....

    con un numero arbitrario di campi.

    C'è qualcuno che saprebbe suggerirmi come realizzare in C una funzione che abbia come parametri di ingresso 2 stringhe, una di questo tipo ed un'altra con il nome di uno dei campi (ad es. "campo2") che restituisca un'ulteriore stringa contenente soltanto il valore di quel campo nella prima stringa (ad es. "valore2).


    Per capirci meglio, la chiamata dovrebbe essere una cosa del tipo:

    stringaRisultato = Funzione(stringaDaTrovare, stringaSorgente);

    Quindi, ad esempio, se la stringa sorgente fosse:

    comune=Roma&regione=Lazio

    e la chiamata:

    res = Funzione("regione", "comune=Roma&regione=Lazio")

    res dovrebbe contenere solo la stringa "Lazio"

  2. #2
    Ok, non sarà il massimo dell' eleganza, ma ho risolto da me così:

    codice:
    char *Estrai(char *target, char *src)
    {
     int len, i = 0, j = 0, trovato = 0, l;
     char *temp;
     len = strlen(target);
     l = len;
     temp = (char *) malloc(len);
     while(src[i] != '\0' && trovato == 0)
     {
      if(src[i] == target[j])
      {
       if(l > 1)
       {
        i++;
        j++;
        l--;
       }
       else
        trovato = 1;
      }
      else
      {
       j = 0;
       l  = len;
       i++;
      }
     }
     if(trovato == 1)
     {
      i++;
      if(src[i] == '=')
      {
       j = 0;
       i++;
       while(src[i] != '&' && src[i] != '\0')
       {
        temp[j] = src[i];
        j++;
        i++;
       }
       temp[j] = '\0';
      }
     }
     return temp;
    }
    Se volete, pareri e consigli per alternative sono sempre ben accetti...

  3. #3
    La funzione si chiama ExtractValue, ed è preceduta da un piccolo esempio del suo impiego:
    codice:
    #include <iostream>
    #include <cstring>
    #define min(a,b)            (((a) < (b)) ? (a) : (b))
    using namespace std;
    char * ExtractValue(const char * source, const char * key, char * buffer, size_t bufsize);
    int main()
    {
    	char sorgente[256], chiave[256], valore[256];
    	cin.getline(sorgente,sizeof(sorgente));
    	cin.getline(chiave,sizeof(chiave));
    	if(ExtractValue(sorgente,chiave,valore,sizeof(valore)))
    		cout<<valore;
    	else
    		cout<<"Valore non trovato";
    	cin.ignore();
    	return 0;
    }
    char * ExtractValue(const char * source, const char * key, char * buffer, size_t bufsize)
    {
    	char * nextEq, * nextAmp;
    	do
    	{
    		if(source==NULL)
    			return NULL;
    		if((nextEq=strchr(source,'='))==NULL)
    			return NULL;
    		if(!strncmp(source,key,nextEq-source))
    		{
    			nextAmp=strchr(source,'&');
    			if(nextAmp!=NULL)
    			{
    				strncpy(buffer,nextEq+1,min(bufsize,nextAmp-nextEq)-1);
    				buffer[min(bufsize,nextAmp-nextEq)-1]=0;
    			}
    			else
    			{
    				strncpy(buffer,nextEq+1,bufsize);
    				buffer[bufsize-1]=0;
    			}
    			return buffer;
    		}
    	} while((source=strchr(source+1,'&'))!=NULL && source++);
    	return NULL;
    }
    .
    Amaro C++, il gusto pieno dell'undefined behavior.

  4. #4
    Originariamente inviato da FastMagister
    Se volete, pareri e consigli per alternative sono sempre ben accetti...
    1. Non controlli il valore restituito da malloc;
    2. Cosa succede se il campo cercato non viene trovato? A prima vista mi sembra che venga restituita una stringa dal contenuto indefinito.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.