• # Pas beaucoup plus simple...

    Posté par . En réponse au message saisie de chaine et correction d'erreur autonome. Évalué à 5.

    Si j'ai bien compris, tu veux tolérer la présence de caractères non numériques dans la chaîne, en les effaçant avant de passe à strtoul. Ok, pourquoi pas. Comme tu veux traiter un nombre entier positif ou nul, c'est assez simple (pour les flottants, je te dis pas ;) ). Premier truc, pour ta boucle de copie, la norme C garantit que '1' == '0' + 1, '2' == '0' + 2... (cf. 5.2.1p3 du n1124 :
    In both the source and execution basic character sets, the value of each character after 0 in the above list of decimal digits shall be one greater than the value of the previous.
    ). Donc tu n'as pas besoin de switch, un if (c >= '0' && c <= '9') est suffisant. Et, encore mieux, isdigit fourni par l'en-tête ctype.h. Deuxième truc : for(i=0;i<strlen(buffer);i++) Il y a de fortes chances que strlen soit appelée à chaque itération, à moins que le compilo arrive à se prouver que tu ne modifies pas le contenu de buffer à l'intérieur de ta boucle (ce qui n'est pas gagné). Il est mieux de faire :
    size_t len = strlen(buffer);
    for (int i = 0; i < len; i++)
    {
       /* ... */
    }
    Enfin, pour strtoul, j'ai un doute en voyant tes bouts de code. Le premier paramètre est une chaînes de caractères, donc un char*. Si buffer2 est de ce type, ou un tableau défini par quelque chose comme char buffer2[N], alors le & est une erreur :
    #include <stdlib.h>
    char tab[50] = "a";
    unsigned long i = strtoul(tab, NULL, 10); /* pas de '&' */