|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Bannato
Iscritto dal: Feb 2003
Città: Anche Chuck Norris usa Debian e Gnome
Messaggi: 1270
|
[C] comparare stringhe
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. |
|
|
|
|
|
#2 |
|
Bannato
Iscritto dal: Feb 2003
Città: Anche Chuck Norris usa Debian e Gnome
Messaggi: 1270
|
Me la sono appena fatta da solo:
Codice:
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;
}
|
|
|
|
|
|
#3 | |
|
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
Comunque il primo if è inutile!
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
|
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 |
|
|
|
|
|
#5 | |
|
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
|
Mea culpa, mi era scappata.
|
|
|
|
|
|
#7 |
|
Bannato
Iscritto dal: Feb 2003
Città: Anche Chuck Norris usa Debian e Gnome
Messaggi: 1270
|
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
|
|
|
|
|
|
#8 |
|
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
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.
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
|
|
|
|
#9 |
|
Senior Member
Iscritto dal: Nov 2004
Città: $HOME
Messaggi: 1213
|
prova a guardare l'implementazione dei principali algoritmi di pattern matching
__________________
Last.fm: My Profile / GamerTag XBL: Martcus / Flickr / deviantArt iBook 12'' / MacBook Pro 13'' / iPhone 3G 16GB Black / iPod 5G 30GB / iPod Nano 2G 4GB |
|
|
|
|
|
#10 | |
|
Bannato
Iscritto dal: Feb 2003
Città: Anche Chuck Norris usa Debian e Gnome
Messaggi: 1270
|
Quote:
|
|
|
|
|
|
|
#11 | |
|
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 09:11.



















