//Bandingkan string dan kembalikan area dimana karakter pertama dari kedua string tersebut sama
kekosongan statis php_similar_str(const char *txt1, int len1, const char *txt2, int len2, int *pos1, int *pos2, int *max)
{
karakter *p, *q;
karakter *end1 = (karakter *) txt1 + len1;
karakter *end2 = (karakter *) txt2 + len2;
ke dalam aku;
*maks = 0;
//Iterasi melalui string
untuk (p = (char *) txt1; p < end1; p++) {
untuk (q = (char *) txt2; q < end2; q++) {
untuk (l = 0; (p + l < akhir1) && (q + l < akhir2) && (p[l] == q[l]); l++);
jika (l > *maks) {
//Simpan informasi area yang sama
*maks = aku;
*pos1 = p - txt1;
*pos2 = q - txt2;
}
}
}
}
//Fungsi rekursif, bandingkan jumlah karakter yang sama di txt1 dan txt2
statis int php_similar_char(const char *txt1, int len1, const char *txt2, int len2)
{
int jumlah;
int pos1, pos2, maks;
php_similar_str(txt1, len1, txt2, len2, &pos1, &pos2, &maks);
if ((sum = max)) {//Apa pentingnya menulis seperti ini????!!!!!!
//Mengulangi bagian depan dari bagian yang berbeda terakhir kali
jika (pos1 && pos2) {
jumlah += php_similar_char(txt1, pos1, txt2, pos2);
}
//Mengulangi bagian terakhir dari bagian yang berbeda
if ((pos1 + maks < len1) && (pos2 + maks < len2)) {
jumlah += php_similar_char(txt1 + pos1 + maks, len1 - pos1 - maks,
txt2 + pos2 + maks, len2 - pos2 - maks);
}
}
//Mengembalikan jumlah karakter identik setelah perbandingan ini
jumlah pengembalian;
}
//Fungsi PHP itu sendiri, sekumpulan makro, melakukan beberapa konversi string dan konversi nilai kembalian, dan fungsi utama dilakukan oleh dua fungsi di atas.
PHP_FUNCTION(teks_serupa)
{
zval **t1, **t2, **persen;
int ac = ZEND_NUM_ARGS();
ke dalam sim;
if (ac < 2 || ac > 3 || zend_get_parameters_ex(ac, &t1, &t2, &persen) == KEGAGALAN) {
SALAH_PARAM_COUNT;
}
convert_to_string_ex(t1);
convert_to_string_ex(t2);
jika (ac > 2) {
convert_to_double_ex(persen);
}
jika (Z_STRLEN_PP(t1) + Z_STRLEN_PP(t2) == 0) {
jika (ac > 2) {
Z_DVAL_PP(persen) = 0;
}
RETURN_LONG(0);
}
(
t1), Z_STRVAL_PP(t2), Z_STRLEN_PP(t2));
Z_DVAL_PP(persen) = sim * 200,0 / (Z_STRLEN_PP(t1) + Z_STRLEN_PP(t2));
}
RETURN_LONG(sim);
}
Terlihat bahwa same_text dibandingkan berdasarkan ASCII, dan masalah frase tidak dipertimbangkan.
Saya mengujinya dan hasilnya sebagai berikut:
int main(int argc, char *argv[])
{
char *str1="weican wuxin";
char *str2="wuxin weican";
int pos1,pos2,maks;
php_similar_str(str1,strlen(str1),str2,strlen(str2),&pos1,&pos2,&maks);
printf("php_similar_str:%d,%d=%dn",pos1,pos2,maks);
max=php_similar_char(str1,strlen(str1),str2,strlen(str2));
printf("php_similar_char:%dn",maks);
sistem("JEDA");
kembali 0;
}
php_similar_str:0,6=6
php_similar_char:6
char *str1="Prinsip kerja komunikasi protokol TCP a";
char *str2="Prinsip kerja komunikasi protokol TCPa";
php_similar_str:3,4=14
php_similar_char:19