Problème && ||

Résolu
iamtheone Messages postés 39 Date d'inscription   Statut Membre Dernière intervention   -  
iamtheone Messages postés 39 Date d'inscription   Statut Membre Dernière intervention   -
Bonjour,
D'abord je tiens à préciser que je ne compte pas faire de typosquating, je fais ce code pour m'entraîner avec les string.
Voici mon conde Javascript :
result0 = [];
result1 = [];
ext = [".com", ".fr"]
qw = {
   a: "q",
   q: "a",
   z: "w"
}


function start() {
    dn = document.form.dn.value;
    dnl = dn.length;
    ta = document.getElementById("ta");
    if (dn=="") {
        alert("Please add a domain name.") 
    } else {
        result0 = [];
        result1 = [];
        ta.innerHTML = "";
        dble();
        if (dn.indexOf("m") == -1 && (dn.indexOf("a")>=0 || dn.indexOf("q")>=0 || dn.indexOf("z")>=0)) {
            qwerty();
        } 
        end();
        for (i=0; i<result0.length; i++) {
            ta.innerHTML += result0[i] + "<br />";
        }
    }
}

function dble() {
    for (i=0; i<dnl; i++) {
        result1[i] = dn.slice(0, i+1) + dn.charAt(i) + dn.slice(i+1);
    }
}

function end() {
    for (i=0, j=0, k=0; i<result1.length-0.001; i+=1/ext.length, j++, k++) {
        if (j==ext.length) {
            var j = 0;
        }
        result0[k] = result1[Math.floor(i)] + ext[j];
    }
}

function qwerty() {
    alert()
    var dnqw = dn;
    for (i=0; i<dnl; i++) {
        if (qw[dnqw[i]]) {
            var dnqw = dnqw.replace(dnqw[i], qw[dnqw[i]]);
        }
    }
    result1[dnl] = dnqw;
}

Et mon HTML :
<!DOCTYPE html>
<html>
    <head>
        <title>Page Title</title>
    </head>
    <body>
        
        <form name="form">
            <input type="text" name="dn" placeholder="google"></input>
            <input type="button" value="Start" onClick="start()"
        </form>
        
        <div id="ta"></div>
        
    </body>
</html>

Mon problème c'est que lorsque j'écris aq ou un mot avec ces deux lettres dans le input, il ressort (après click sur start) comme il a été entré. Par exemple aq donnera aq et non qa ou encore macaque donnera macaque et non mqcqaue... Je ne comprend pas :/. Sachant que avec az ou qz tout se passe bien.
Merci de votre aide.

2 réponses

jordane45 Messages postés 38486 Date d'inscription   Statut Modérateur Dernière intervention   4 752
 
Bonjour,

J'ai un peu la flemme de décortiquer ton code ...;
par contre.. toi tu peux déjà ajouter un peu de débogage ( à l'aide de console.log .. ) dans ton code histoire d'essayer de comprendre ce qui ne "marche" pas.

Par exemple, avant ton if
 if (dn.indexOf("m") == -1 && (dn.indexOf("a")>=0 || dn.indexOf("q")>=0 || dn.indexOf("z")>=0))

tu pourrais faire des console.log de chaque bloc et voir ce que ça t'affiche :
 console.log('dn.indexOf(m) :' + dn.indexOf("m") );
 console.log('dn.indexOf(a) :' + dn.indexOf("a") );
 console.log('dn.indexOf(q) :' + dn.indexOf("q") );
 console.log('dn.indexOf(z) :' + dn.indexOf("z") );


au passage ... évites si possible les variables globales (sauf si vraiment nécessaire... ce qui n'est pas le cas ici ) et préfères utiliser le passage de paramètres et les return dans tes fonctions.

0
Utilisateur anonyme
 
Bonjour

Le mot "macaque" ,n'est pas un bon exemple puisque tu n'appliques pas qwerty aux mots qui contiennent m.
Si on oublie ce détail, ton problème vient de l'accumulation de deux autres :
- La fonction String.replace que tu utilises dans qwerty ne modifie que la première occurence du caractère recherché.
- Tu fais tes substitutions les unes après les autres. Si on considère le mot acaque :
. il devient d'abord qcaque
. puis on trouve le deuxième a, il devient qcqque
. puis on trouve le q suivant et on remplace, mais c'est le premier q qui est remplacé : on obtient acqque

À ta place, dans qwerty, je recopierais la chaîne caractère par caractère en faisant la substitution quand je rencontre l'un des caractères à transformer.
0
iamtheone Messages postés 39 Date d'inscription   Statut Membre Dernière intervention  
 
Oui c'est pas un bon exemple :$. Sinon merci de ta réponse, mais je ne vois pas comment faire d'une autre manière... Help :'(
0
Utilisateur anonyme > iamtheone Messages postés 39 Date d'inscription   Statut Membre Dernière intervention  
 
Tu as lu mes deux dernières lignes ? Je ne peux pas croire qu'ayant écrit tout ça tu ne les comprends pas, C'est beaucoup plus simple que tout ce que tu as fait avant.
0
iamtheone Messages postés 39 Date d'inscription   Statut Membre Dernière intervention  
 
Je sais pas, ce matin je devais pas être bien réveillé... Bref, voilà le code fonctionnel :
function qwerty() {
    var dnqw = "";
    for (i=0; i<dnl; i++) {
        if (qw[dn.charAt(i)]) {
            dnqw += qw[dn.charAt(i)];
        } else {
            dnqw += dn.substring(i, i+1);
        }
    }
    result1.push(dnqw);
}

Merci de ton aide :))
0
Utilisateur anonyme > iamtheone Messages postés 39 Date d'inscription   Statut Membre Dernière intervention  
 
De rien :)
Pour le else, moi j'aurais simplement mis dnqw += dn.charAt(i);
J'aurais même sans doute utilisé l'opérateur ternaire :

var c= dn.charAt(i);
dnqw +=qw[c] ? qw[c] : c;
0
iamtheone Messages postés 39 Date d'inscription   Statut Membre Dernière intervention   > Utilisateur anonyme
 
Ah oui c'est sûr que c'est hien plus compacte, merci. Mais pour le moment je vais en rester à l'écriture "détaillée" car je débute ;).
0