PDA

View Full Version : [C] comparare stringhe


redcloud
14-12-2005, 21:31
Salve, secondo voi esiste una funzione del genere (in C ma va bene anche solo l'algoritmo):

data una stringa S di lunghezza arbitraria, del tipo abNNf42NcdNgN, verificare l'uguaglianza con stringa Z di lunghezza uguale a meno dei caratteri N. Gli N caratteri hanno disposizione arbitraria e sono presenti un numero arbitrario di volte.

Cioè, se ho casNdiajcNjjki, voglio che la funzione mi dica che è uguale a quest'altra stringa cas7diajckjjkj o cashdiajcgjjki o ecc... Insomma che sia uguale a qualsiasi altra stringa a meno dei caratteri N che possono assumere valori arbitrari.

redcloud
14-12-2005, 23:18
Me la sono appena fatta da solo:
int strncmpadv(char *src, char *dest, char c) {
int i=0;
int length=strlen(src);

for(i=0; i<length; i++) {
if((src[i]!=c) && (src[i]==dest[i]));
if((src[i]!=c) && (src[i]!=dest[i])) return 0;
}

return 1;
}

andbin
15-12-2005, 09:21
Me la sono appena fatta da solo:
int strncmpadv(char *src, char *dest, char c) {
int i=0;
int length=strlen(src);

for(i=0; i<length; i++) {
if((src[i]!=c) && (src[i]==dest[i]));
if((src[i]!=c) && (src[i]!=dest[i])) return 0;
}

return 1;
}
Infatti ... perché non esiste una funzione "standard" che faccia già questa cosa.
Comunque il primo if è inutile! ;)

sottovento
15-12-2005, 09:40
In caso di lunghezze diverse della stringa (in particolare se dest e' inferiore a src), il codice andra' in crash. Ti consiglio di provare un'altra implementazione piu' protetta.
Una possibile implementazione che risolve il problema (Certamente non la migliore) potrebbe essere:

int strncmpadv(char *src, char *dest, char c)
{
while (*src && *dest)
{
if (*src == c)
{
src++;
continue;
}
if (*src++ != *dest++) return 0;
}
return !(*src || *dest);
}

Non l'ho provata, ma mi sembra stia in piedi

High Flying
Sottovento

andbin
15-12-2005, 09:54
In caso di lunghezze diverse della stringa (in particolare se dest e' inferiore a src), il codice andra' in crash.
No, non va in crash. Se src è più corta di dest non ci sono problemi perchè il confronto si ferma prima e se invece src è più lunga di dest nemmeno, perché ad un certo punto il carattere nullo in dest viene comparato con un qualche carattere in src ed essendo diversi ritorna, giustamente, con 0.

sottovento
15-12-2005, 10:41
Mea culpa, mi era scappata.

redcloud
15-12-2005, 11:21
Si mi sono dimenticato di togliere quell'if. Cmq l'ho buttata giu in 1 minuto perchè pensavo potesse servirmi solo per un caso particolare (stringhe di stessa lunghezza) e invece funziona anche con stringhe di lunghezza arbitraria :D

andbin
15-12-2005, 12:08
Ci sarebbe ancora un piccolo dettaglio da tenere in considerazione. Cosa succede se si mette src="Paper" e dest="Paperino"??? Semplice ... restituisce 1 (cioè uguali) ma non è giusto perché vengono comparati solo i primi 5 caratteri di entrambi.
A rigor di logica dovrebbe restituire 0 e per risolvere la cosa basta mettere il test nel for a: i<=length.
Questo tra l'altro risolverebbe anche un altro caso particolare: quello in cui si passa src="" (una stringa vuota) e dest una stringa non vuota. Solo con il < restituirebbe 1 perché non si entrerebbe nemmeno nel ciclo for.

v1ruz
15-12-2005, 12:10
prova a guardare l'implementazione dei principali algoritmi di pattern matching

redcloud
15-12-2005, 12:37
Ci sarebbe ancora un piccolo dettaglio da tenere in considerazione. Cosa succede se si mette src="Paper" e dest="Paperino"??? Semplice ... restituisce 1 (cioè uguali) ma non è giusto perché vengono comparati solo i primi 5 caratteri di entrambi.
A rigor di logica dovrebbe restituire 0 e per risolvere la cosa basta mettere il test nel for a: i<=length.
Questo tra l'altro risolverebbe anche un altro caso particolare: quello in cui si passa src="" (una stringa vuota) e dest una stringa non vuota. Solo con il < restituirebbe 1 perché non si entrerebbe nemmeno nel ciclo for.
Beh si è vero ma nel mio caso so apriori che la prima stringa non è mai più corta della seconda. Cmq ci sarebbero da considerare tutti i possibili errori (se la si volesse usare come funzione di libreria) per renderla sicura. A me serviva una funzioncina abbastanza limitata, tutto qui. :D

andbin
15-12-2005, 12:54
Beh si è vero ma nel mio caso so apriori che la prima stringa non è mai più corta della seconda.Ok ... è che io sono abituato a pensare sempre un po' più in "generale" quando programmo. ;)