Se si dispone di un set di valori stringa piccoli e si desidera recuperare un valore numerico per rappresentarli, qual è il modo migliore per farlo tramite una tabella di ricerca?Tabella di ricerca del valore in C per stringhe?
Se fossi solo bisogno di fare uno sguardo verso l'alto, so che la soluzione ottimale sarebbe solo una serie di istruzioni if:
if (strcmp(str, "foo") == 0)
tmp = FOO;
else if (strcmp(str, "bar") == 0)
tmp = BAR;
Ma, mi chiedo perché questi piccoli valori di stringa rappresentano un attributo in un piccolo progetto sto scrivendo in C, e gli attributi possono essere di sola lettura o di lettura-scrittura (non scrivere solo per ora, forse mai).
Quindi quello che faccio al momento giusto per assicurarmi che le cose funzionino è avere una funzione di ricerca composta da una clausola if-then come sopra per cercare quali valori sono di sola lettura, e una seconda funzione che cerca quali valori vengono letti -Scrivi. Ma questo è grande e brutto per me.
Sto pensando, ho tre funzioni. Una funzione è la funzione di ricerca e restituisce un valore int che è la forma numerica della stringa. Ma questa funzione di ricerca può anche assumere un flag che determina se recupera un valore di sola lettura o un valore di lettura-scrittura. Se un'operazione di scrittura viene eseguita su un valore che è realmente di sola lettura, la funzione restituirà -EINVAL (o qualcosa di equivalente).
Le altre due funzioni, ora ancora la lettura e la scrittura, chiamano semplicemente questa funzione di ricerca, passando una stringa del valore e la bandiera che determina se sono per la lettura o la scrittura.
Il fatto è che non so come sia modellato in C (se può essere modellato), e la ricerca di Google è noiosa con tutte le farm di contenuti che eliminano questo posto (e mi danno invece le risposte C++/C#) .
Quindi questo è come penso che guarderò:
int lookup_func(const char *name, const char *flag) {
int tmpval = 0;
/* code to do the lookup. */
if (tmpval == 0)
return -EINVAL;
else
return tmpval;
}
int get_readonly_bit(const char *name) {
return lookup_func(name, "ro");
}
int get_readwrite_bit(const char *name) {
return lookup_func(name, "rw")
}
Pensieri? L'idea è di ridurre le dimensioni del codice non ripetendo i rami if-then per queste due funzioni, che differiscono leggermente nella progettazione generale, e lasciano semplicemente che una specie di funzione di ricerca capisca quale funzione serve a questo valore.
+1 per const correttezza ... * ma la bandiera è meglio come un int (o enum) * – pmg
You want an [funzione di hash] (http://en.wikipedia.org/wiki/Hash_function). A seconda dei valori della stringa, potrebbe essere semplice come restituire il valore della prima lettera ... – pmg
@ pmg: c'è ancora una probabilità di più stringhe con lo stesso hash. Piccolo, ma è :) –