Erreur invisible!

Résolu
Bonjour à tous,

Ce script python ne marche pas après bonne heur de tentative de débogage
je n'y suis toujours pas, même après être aller voir la correction de l'exercice qui ressemble trait pour trait au mien:
def changeCar(ch, ca1, ca2, start=0, end=-1):
"fonction qui remplace les car ca1 par ca2 dans ch"
if end == -1:
end = len(ch)
nch, i = "", 0
while i <= len(ch):
if i >= start and i <= end and ch[i] == ca1:
nch = nch + ca2
else:
nch = nch + ch[i]
i+=1
return nch

phrase = "aidez moi a changer les caractère de cette phrase svp.."
print(changeCar(phrase, " ", "*",))

l'exécution de ce code me donne:

Traceback (most recent call last):
File "changecar.py", line 15, in <module>
print(changeCar(phrase, " ", "*",))
File "changecar.py", line 7, in changeCar
if (i >= start)and(i <= end)and(ch[i] == ca1):
IndexError: string index out of range

Je ne comprend toujours pas ce qui ne va pas.
Merci, cordialement.

2 réponses

  1. Salut
    Le problème est très courant et pourtant très simple. Tu as l'erreur "index out of range" qui signifie que tu demande à accéder à un élément de la liste qui n'existe pas.
    Il faut que tu te rappelles de deux choses :
    - len() te donne le nombre de caractères d'une chaîne, donc len("de")=2
    - une chaîne de caractère est une liste et comme toute liste, le premier élément a l'index 0 ET PAS 1 !

    Ca veut dire que si tu fait une boucle qui va de 0 à len("de") en affichant un les caractère, Python va vouloir afficher l'élément d'index 0, le "d", l'élément d'index 1, le "e" puis l'élément d'index 2 qui n'existe pas. Tu as alors l'erreur "index out of range". Donc deux choix : while (i<=len("de")-1) ou bien while(i<len("de")

    Je pense que tu devrais être capable d'adapter ça à ton problème. ;) Sinon re-poste ici et j'essaierai d'être plus clair.
    0
    1. Je n'avais pas vu le dernier message, impossible d'être plus clair! Comprendre d'où viens l'erreur m'éviteras de la refaire, merci beaucoup pour ta patience ;)
      0
  2. Bonjour,

    En fait l'erreur est bien visible: le problème est le "if".
    Donc si on retire la boucle "while" et la "if" pour les remplacer par un "for" tu veras que ça marche nickel :)

    #!/usr/bin/env python
    # -*- coding: utf-8 -*-

    def changeCar(ch, cal, ca2, end = -1):
    "fonction qui remplace les car cal par ca2 dans ch"
    if end == -1:
    end = len(ch);
    nch = "";
    for i in range(0, end):
    if ch[i] == cal:
    nch = nch + ca2;
    else:
    nch = nch + ch[i];
    i = i+1;

    return nch

    phrase = "aides moi a changer les caracteres de cette phrase svp.."
    print changeCar(phrase," ","*");
    1
    1. sa marche nickel :) merci beaucoup! Je comprend que l'erreur viens du if mais je ne vois vraiment pas pourquoi le code d'origine ne marche pas...
      0