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.
