Erreur invisible!

Résolu/Fermé
iron uchiwa Messages postés 57 Date d'inscription mercredi 24 juillet 2013 Statut Membre Dernière intervention 17 février 2016 - 29 avril 2014 à 16:55
iron uchiwa Messages postés 57 Date d'inscription mercredi 24 juillet 2013 Statut Membre Dernière intervention 17 février 2016 - 2 juin 2014 à 16:04
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

JulienJust Messages postés 139 Date d'inscription mardi 25 juin 2013 Statut Membre Dernière intervention 2 septembre 2014 18
30 avril 2014 à 09:44
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
iron uchiwa Messages postés 57 Date d'inscription mercredi 24 juillet 2013 Statut Membre Dernière intervention 17 février 2016 15
1 mai 2014 à 20:33
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
pols12 Messages postés 1143 Date d'inscription lundi 22 mars 2010 Statut Membre Dernière intervention 31 juillet 2019 119
2 mai 2014 à 11:22
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
iron uchiwa Messages postés 57 Date d'inscription mercredi 24 juillet 2013 Statut Membre Dernière intervention 17 février 2016 15
2 juin 2014 à 16:04
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