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.
<?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.