értékadás string-ből

 ( kaltsi | 2009. január 12., hétfő - 13:26 )

Lenne egy C vagy C++ kód ami fogad infót, ez lehet tcp-ről, file-ből, stb...
Ott beolvas egy string-et, amiben különböző értékadások vannak, pl.: alma=piros;korte=sarga;szilva=lila; ....
hogy tudnám e értékadásokat legegyszerűbben változóknak adni, tehát a char korte[50] változó felvenné a sarga értéket. Azaz hogy tudnam a stinget azonosítani a változóval. Olyan egysezrű megoldás triviális, mint végigkeresni az összes lehetőséget, és egyezés esetén kiválasztani, de gondolom van komplexebb megoldás is.

Hozzászólás megjelenítési lehetőségek

A választott hozzászólás megjelenítési mód a „Beállítás” gombbal rögzíthető.

Esetleg hasznalhatsz map-ot vagy Qt eseten QMap-ot. A C++ -ban nincs evaluacios lehetoseg, mert sem nem interpretalt sem nem JIT-forditott rendszer. Vagy matchelsz. Nem veletlen dolog, hogy a getopt-os kodok is vegigmennek a lehetosegeken switch()-el, ez az egyetlen megoldas.
--

()=() Ki oda vagyik,
('Y') hol szall a galamb
C . C elszalasztja a
()_() kincset itt alant.

köszi, akkor marad a felsorolás, mert az eval()-t nem akarom használni...

Hiába akarnád, nem tudod... C/C++-ban nincs ilyen.

Ha C++, akkor a legegyszerűbb, ha csinálsz egy map-et a változóknak:

map<string,string> data;

Értékadás:

string name;
string value;
// beolvasod és értelmezed az értékadást az inputból, majd
data[name]=value;

Ekkor ha kell a korte értéke, akkor ezt írod:

string temp=data["korte"];

"...handing C++ to the average programmer seems roughly comparable to handing a loaded .45 to a chimpanzee."
-- Ted Ts'o

Esetleg map data (vagy ugyanez referenciaval) es akkor a mapbe kozvetlenul lehetne a valtozokat belerakni.

Van a -ldl konyvtar, azon belul a dlopen() es a dlsym() a bara'tod:

#include <stdio.h>
#include <stdlib.h>
#include <dlfcn.h>

char korte[64];

int funct(int a,int b)
{
 return(a+b);
}

int main(void)
{
 char *korte_ptr;
 void *handle;
 handle=dlopen(NULL,RTLD_NOW);
 fprintf(stderr,"handle=%p\n",handle);
 korte_ptr=(char *)dlsym(handle,"korte");
 fprintf(stderr,"korte_ptr=%p\n",(void *)korte_ptr);
 fprintf(stderr,"korte=%p\n",(void *)korte);
 return(0);
}

Forditani pedig:

gcc -Wall -pedantic -ansi -O3 -D_GNU_SOURCE -rdynamic -o korte korte.c -ldl

(lenyeg a -rdynamic es a -ldl).

Ha ezek az objektumok (char korte[50]; ...) kulso globalisok, akkor mennie kell. Belso valtozokra es/vagy kulso statikusokra nyilvan nem, pontosabban belsokre nyilvan, a kulso stat-ra gondolom nem.

De szvsz ez az egesz az alap-problemadra nem a legelegansabb megoldas. Lookup-tablak (hash-tree), dinamikusan allokalt tombok a valtozoknak/valtozoertekeknek, esatobbi. Persze fugg a tenyleges gyakorlati problematol is...

A.

Szerintem ez a valasz a kerdesre, de nem javaslom. Foleg, ha nem megbizhato helyrol szarmazik az input, eleg sok gonosz dolgot muvelhet egy gonosz input.


Amit nem lehet megirni assemblyben, azt nem lehet megirni.

C-ben szerintem a keresést gyorsíthatod, nem kell mindet végig nézni, ha abc sorrendben vannak a kulcsok.
Van két tömböd az egyikben a kulcsok, a másikban az értékek, az összetartozó kulcs-érték párnak azonos az indexe a két tömbben.
A kulcs index kikeresését gyorsíthatod.

/* MAX_PAIRS: maximal number of key-value pairs 
 * MAX_KEY_LEN: maximal length of the key string (in characters)
 * MAX_VALUE_LEN: maximal length of the value string
 */
char keys_array[MAX_PAIRS][MAX_KEY_LEN+1];
char values_array[MAX_PAIRS][MAX_VALUE_LEN+1];

int get_key_index(char* key_string) {
  char* cp;
  in key_index;
  
  /* get a pointer to te key string in the key array */
  cp=bsearch(key_string,keys_array,MAX_PAIRS,MAX_KEY_LEN+1,(int(*)(const void*,const void*))&strcmp);
  if(cp==NULL)
  {
     return -1; /* no match */
  }
  /* calculate index from the pointer */
  key_index=(cp-words)/(MAX_KEY_LEN+1);
  return key_index;
}

int set_value(char* key_string,char* value_string) {
  int key_index;

  if((key_index=get_key_index(key_string))<0)
    return -1;
  strcmp(key_values[key_index],value_string);
  return 0;
}

Ha tisztán C-ben szeretnéd megírni...
Persze nem próbáltam ki :)
Kimaradt némi range ellenőrzés (pl. value_string hossza).
A keys_array-t abc sorrendben kell inicializálni.