Prima di proseguire...
Potrebbe interessarti la nostra collezione di esercizi C risolti?
Vediamo oggi come analizzare due testi e come stampare il punto in cui c’è la differenza.
Questo metodo è lo stesso utilizzato in http://www.thecsea.it/servizi/comp_testi
Creiamo una funzione che dati in ingresso le due stringhe(testi) restituisce un valore >= 0 che indica la posizione in cui differiscono;-1 se sono uguali; -2 se la prima stringa è più corta, ma fino alla fine della prima stringa le due stringhe sono uguali; -3 se la seconda stringa è più corta, ma fino alla fine della seconda stringa le due stringhe sono uguali.
Analizziamo il codice, le stringhe in questo caso vengono lette da due file.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | <?php /* >= 0 -> posizione errore -1 -> identiche -2 -> lunghezza diversa e fino alla fine della prima stringa sono uguali -3 -> lunghezza diversa e fino alla fine della seconda stringa sono uguali */ function check( $txt1 , $txt2 ){ $len [1] = strlen ( $txt1 ); $len [2] = strlen ( $txt2 ); $len [0] = $len [1]; if ( $len [1] > $len [2]) $pos_len = 2; elseif ( $len [2] > $len [1]) $pos_len = 1; else $pos_len = 0; for ( $i =0; $i < $len [ $pos_len ]; $i ++) if ( $txt1 [ $i ] != $txt2 [ $i ]) return $i ; return -( $pos_len +1); } $txt1 = fopen ( "1.txt" , "r" ); $txt1 = fread ( $txt1 , filesize ( "1.txt" )); $txt2 = fopen ( "2.txt" , "r" ); $txt2 = fread ( $txt2 , filesize ( "2.txt" )); $pos = check( $txt1 , $txt2 ); if ( $pos >=0) print "posizione differenza : " . $pos . "\n<h1>testo consecutivo alla differenza :</h1>\n<h2>primo</h2>\n<pre>" .htmlentities( substr ( $txt1 , $pos ),ENT_QUOTES, "utf-8" ). "</pre><h2>secondo</h2>\n<pre>" .htmlentities( substr ( $txt2 , $pos ),ENT_QUOTES, "utf-8" ). "</pre>" ; elseif ( $pos ==-1) print "le due stringhe sono uguali" ; elseif ( $pos ==-2) print "la prima stringa è più corta, ma fino alla fine della prima stringa le due stringhe sono uguali" ; elseif ( $pos ==-3) print "la seconda stringa è più corta, ma fino alla fine della seconda stringa le due stringhe sono uguali" ; else print "ERRORE" ; ?> |
In pratica per confrontare due file basta leggerli e passarli come parametro alla funzione, controllo il valore di ritorno e stampo i vari messaggi ad esso collegati, in particolare se mi ritorna un valore >= 0 stampo i due testi dal punto in cui è stata rilevata la differenza e trami htmlentietes faccio si che i caratteri speciali vangano convertiti.
La funzione è abbastanza semplice per quanto riguarda il normale controllo della differenza, mentre per gli altri casi viene utilizzata un’apposita variabile.
In particolare all’inizio si calcolano le lunghezze delle stringhe e li si memorizzano in un vettore di 3 elementi, la 3 lunghezza è uguale alla prima, perché serve quando le lunghezze sono uguali, in modo da evitare controlli futuri, ma avere un valore apposito.
In seguito controllo se le due stringhe sono uguali o quale è la loro disuguaglianza, in termini di lunghezza, in particolare se la prima è maggiore assegno 2 a pos_len, se la seconda è maggiore assegno 1 se no 3.
Quindi così nel for, di controllo carattere per carattere, itero solo un numero sufficiente di volte in particolare itero fino a quando ho finito di leggere la stringa più piccola, se trovo differenze ritorno il punto della differenza; se no ritorno pos_len cambiando di segno e con sommato uno, dato che gli altri ritorni partono da -1 e non da 0.
N.B. Se si vogliono scoprire le differenze successive si può fare un ciclo che richiama la funzione partendo dalla posizione dell’ultima differenza incrementata di uno e che memorizzi le altre in un array.
confrontare due testi by cardinale claudio is licensed under a Creative Commons Attribution-ShareAlike 4.0 International License.