if(*c
On ne vérifie pas la validité du pointeur mais le contenue. Je test pour savoir si le caractère dans *c est nul. Si oui, inutile de comparer sont précédent car il n'y a plus rien après. On peut cependant s'arranger autrement
Pour le *(c-1) en dehors de la zone, oui c'est vrai, je n'y avait pas pensé mais il serait très étonnant que la valeur à cet endroit soit '-'. D'ailleurs, ça m'étonnerais beaucoup qu'il y ai des dégâts comme tu dit car il ne fait que lire.
Voici un model corrigé:
if(c != str && *(c-1) == '-') --c; // atof s'arrangera si il y a un - en fin de chaine
ou
if(*c && c != str && *(c-1) == '-') --c; // atof s'arrangera si il s'agit du 0 de fin de chaine
ou encore
if(!*c) return 0; // Quitte direct s'il n'y a aucun chiffre dans la chaine
else if(c != str && *(c-1) == '-') --c;
En passent, j'ai beaucoup de difficulté à comprend comment ton code pourrait bien fonctionner:
while(!pszStr[i] && pszStr[i] < 47 || pszStr[i] > 58) i++
Quitte sitôt qu'un caractère est non nul donc direct en début de chaine.
C++ (@++)