C'est parce qu'avec un "break", l'execution de la boucle est interrompue immédiatement, alors que dans ton code l'execution se poursuivait jusqu'à la prochaine évaluation de la condition de sortie.
Etant donné que tu débutes, je me permets de m'étendre un peu sur la question :
La boucle for prend trois paramètres, dont aucun n'est obligatoire en théorie. Le premier rassemble la ou les conditions initiales, qui peuvent être omises si elles ont été faites avant dans le programme. Le deuxième est la condition à respecter pour que l'éxecution de la boucle se poursuive. La troisième instruction est executée à la fin de chaque cycle.
Lorsque tu écris for(i=0;i<10;i++){instructions}, ces instructions sont executées dans l'ordre suivant :
i=0
i<10 ? si non, fin de la boucle
instructions
i++
i<10 ?
instructions
i++
...
Ainsi dans ta boucle, lorsque la condition "if (Tableau[i] == '!')fini=true;" est vérifiée, la variable i est incrémentée avant que la condition de sortie "i< 100 && !fini" soit traitée. Et ton programme prend donc en compte un caractère de trop.
Voilà, j'espère que j'ai été un peu clair !