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 '&' */
# Pas beaucoup plus simple...
Posté par alf . En réponse au message saisie de chaine et correction d'erreur autonome. Évalué à 5.
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 :